diff --git a/CMakeLists.txt b/CMakeLists.txt index 90bd7ac4..242dfce3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -19,7 +19,7 @@ else() option(GREX_ENABLE_VULKAN "Build Vulkan projects" ON) endif() - +option(GREX_ENABLE_SLANG "Build Slang version of Vulkan projects" OFF) option(GREX_ENABLE_MISC_PROJECTS "Build misc projects" OFF) # ------------------------------------------------------------------------------ @@ -53,6 +53,14 @@ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +# ------------------------------------------------------------------------------ +# Compiler otions +# ------------------------------------------------------------------------------ +if (MSVC) + set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") +endif() + # ------------------------------------------------------------------------------ # Compile flags and definitions # ------------------------------------------------------------------------------ @@ -127,6 +135,28 @@ if (VULKAN_INCLUDE_DIR) message(" Vulkan library directory: ${VULKAN_LIBRARY_DIR}") endif() +# ------------------------------------------------------------------------------ +# Slang +# ------------------------------------------------------------------------------ +if (GREX_ENABLE_SLANG) + if (NOT SLANG_DIR) + message(FATAL_ERROR "GREX_ENABLE_SLANG requires -DSLANG_DIR=") + endif() + + set(SLANG_INCLUDE_DIR "${SLANG_DIR}/include") + set(SLANG_LIBRARY_DIR "${SLANG_DIR}/lib") + + if (NOT EXISTS "${SLANG_DIR}/include/slang.h") + message(FATAL_ERROR "Could not find slang.h at ${SLANG_DIR}/include/slang.h") + endif() + + message("Found Slang:") + message(" Slang include directory: ${SLANG_INCLUDE_DIR}") + message(" Slang library directory: ${SLANG_LIBRARY_DIR}") + + include(cmake/slang.cmake) +endif() + # ------------------------------------------------------------------------------ # glslang # ------------------------------------------------------------------------------ diff --git a/assets/projects/111_mesh_shader_meshlets/shaders.hlsl b/assets/projects/111_mesh_shader_meshlets/shaders.hlsl index 687556dd..78972ac1 100644 --- a/assets/projects/111_mesh_shader_meshlets/shaders.hlsl +++ b/assets/projects/111_mesh_shader_meshlets/shaders.hlsl @@ -17,10 +17,10 @@ struct Vertex { }; struct Meshlet { - uint VertexOffset; - uint TriangleOffset; - uint VertexCount; - uint TriangleCount; + uint VertexOffset; + uint TriangleOffset; + uint VertexCount; + uint TriangleCount; }; StructuredBuffer Vertices : register(t1); @@ -33,6 +33,7 @@ struct MeshOutput { float3 Color : COLOR; }; +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -74,6 +75,7 @@ void msmain( } } +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/112_mesh_shader_amplification/shaders.hlsl b/assets/projects/112_mesh_shader_amplification/shaders.hlsl index 00361c67..c49af1db 100644 --- a/assets/projects/112_mesh_shader_amplification/shaders.hlsl +++ b/assets/projects/112_mesh_shader_amplification/shaders.hlsl @@ -44,6 +44,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -59,6 +60,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -106,6 +108,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/113_mesh_shader_instancing/shaders.hlsl b/assets/projects/113_mesh_shader_instancing/shaders.hlsl index a536205f..60b61274 100644 --- a/assets/projects/113_mesh_shader_instancing/shaders.hlsl +++ b/assets/projects/113_mesh_shader_instancing/shaders.hlsl @@ -53,6 +53,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -78,6 +79,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -128,6 +130,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/114_mesh_shader_culling/shaders.hlsl b/assets/projects/114_mesh_shader_culling/shaders.hlsl index 7f40f27c..ddc9a8fb 100644 --- a/assets/projects/114_mesh_shader_culling/shaders.hlsl +++ b/assets/projects/114_mesh_shader_culling/shaders.hlsl @@ -144,7 +144,7 @@ bool VisibleFrustumConeAndNearPlane(float4 sphere) { bool i0 = VisibleFrustumCone(sphere); - FrustumPlane frNear = Scene.Frustum.Planes[FRUSTUM_PLANE_NEAR]; + FrustumPlane frNear = Scene.Frustum.Planes[(int)FRUSTUM_PLANE_NEAR]; float d0 = SignedPointPlaneDistance(sphere.xyz, frNear.Normal, frNear.Position); bool i1 = (abs(d0) < sphere.w); // Intersects with near plane bool i2 = (d0 > 0); // On positive half space of near plane @@ -152,6 +152,7 @@ bool VisibleFrustumConeAndNearPlane(float4 sphere) return i0 && (i1 || i2); }; +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -200,6 +201,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -250,6 +252,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/115_mesh_shader_lod/shaders.hlsl b/assets/projects/115_mesh_shader_lod/shaders.hlsl index 6ddc65e6..4ad4fd6a 100644 --- a/assets/projects/115_mesh_shader_lod/shaders.hlsl +++ b/assets/projects/115_mesh_shader_lod/shaders.hlsl @@ -49,6 +49,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -86,6 +87,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -136,6 +138,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/116_mesh_shader_calc_lod/shaders.hlsl b/assets/projects/116_mesh_shader_calc_lod/shaders.hlsl index c3150098..46122566 100644 --- a/assets/projects/116_mesh_shader_calc_lod/shaders.hlsl +++ b/assets/projects/116_mesh_shader_calc_lod/shaders.hlsl @@ -56,6 +56,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -112,6 +113,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -162,6 +164,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/117_mesh_shader_cull_lod/shaders.hlsl b/assets/projects/117_mesh_shader_cull_lod/shaders.hlsl index 30dc486c..6601941e 100644 --- a/assets/projects/117_mesh_shader_cull_lod/shaders.hlsl +++ b/assets/projects/117_mesh_shader_cull_lod/shaders.hlsl @@ -153,7 +153,7 @@ bool VisibleFrustumConeAndNearPlane(float4 sphere) { bool i0 = VisibleFrustumCone(sphere); - FrustumPlane frNear = Scene.Frustum.Planes[FRUSTUM_PLANE_NEAR]; + FrustumPlane frNear = Scene.Frustum.Planes[(int)FRUSTUM_PLANE_NEAR]; float d0 = SignedPointPlaneDistance(sphere.xyz, frNear.Normal, frNear.Position); bool i1 = (abs(d0) < sphere.w); // Intersects with near plane bool i2 = (d0 > 0); // On positive half space of near plane @@ -161,6 +161,7 @@ bool VisibleFrustumConeAndNearPlane(float4 sphere) return i0 && (i1 || i2); }; +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -239,6 +240,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -289,6 +291,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); diff --git a/assets/projects/118_mesh_shader_vertex_attrs/shaders.hlsl b/assets/projects/118_mesh_shader_vertex_attrs/shaders.hlsl index 1be135ad..96ea50c6 100644 --- a/assets/projects/118_mesh_shader_vertex_attrs/shaders.hlsl +++ b/assets/projects/118_mesh_shader_vertex_attrs/shaders.hlsl @@ -48,6 +48,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -63,6 +64,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -110,6 +112,7 @@ void msmain( // ------------------------------------------------------------------------------------------------- // Pixel Shader // ------------------------------------------------------------------------------------------------- +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { float3 color = input.PositionWS; diff --git a/assets/projects/119_mesh_shader_vertex_bary/shaders.hlsl b/assets/projects/119_mesh_shader_vertex_bary/shaders.hlsl index 7222ffb3..342b86ba 100644 --- a/assets/projects/119_mesh_shader_vertex_bary/shaders.hlsl +++ b/assets/projects/119_mesh_shader_vertex_bary/shaders.hlsl @@ -46,6 +46,7 @@ groupshared Payload sPayload; // ------------------------------------------------------------------------------------------------- // Amplification Shader // ------------------------------------------------------------------------------------------------- +[shader("amplification")] [numthreads(AS_GROUP_SIZE, 1, 1)] void asmain( uint gtid : SV_GroupThreadID, @@ -61,6 +62,7 @@ void asmain( // ------------------------------------------------------------------------------------------------- // Mesh Shader // ------------------------------------------------------------------------------------------------- +[shader("mesh")] [outputtopology("triangle")] [numthreads(128, 1, 1)] void msmain( @@ -114,6 +116,7 @@ struct PSInput { float3 Bary : SV_BARYCENTRICS; }; +[shader("pixel")] float4 psmain(PSInput input) : SV_TARGET { // Get triangle's vertex indices diff --git a/assets/projects/201_pbr_spheres/drawtexture.hlsl b/assets/projects/201_pbr_spheres/drawtexture.hlsl index 2960f491..02b43405 100644 --- a/assets/projects/201_pbr_spheres/drawtexture.hlsl +++ b/assets/projects/201_pbr_spheres/drawtexture.hlsl @@ -20,13 +20,14 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; - VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) - { +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) +{ VSOutput output = (VSOutput)0; output.PositionCS = mul(SceneParams.MVP, float4(PositionOS, 1)); output.TexCoord = TexCoord; return output; - } +} // @@ -36,6 +37,7 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_Target { float3 color = IBLEnvironmentMap.SampleLevel(IBLMapSampler, input.TexCoord, 0).xyz; diff --git a/assets/projects/201_pbr_spheres/shaders.hlsl b/assets/projects/201_pbr_spheres/shaders.hlsl index 8bb7492d..2e76d677 100644 --- a/assets/projects/201_pbr_spheres/shaders.hlsl +++ b/assets/projects/201_pbr_spheres/shaders.hlsl @@ -16,7 +16,7 @@ struct SceneParameters { uint IBLEnvironmentNumLevels; }; -#ifdef __spirv__ +#if defined(__spirv__) struct DrawParameters { float4x4 ModelMatrix; @@ -43,7 +43,7 @@ struct MaterialParameters { ConstantBuffer DrawParams : register(b1); ConstantBuffer MaterialParams : register(b2); -#endif +#endif // defined(__spirv__) ConstantBuffer SceneParams : register(b0); Texture2D IBLIntegrationLUT : register(t3); @@ -61,6 +61,7 @@ struct VSOutput { float3 Normal : NORMAL; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float3 Normal : NORMAL @@ -197,6 +198,7 @@ float3 ACESFilm(float3 x) return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { // Scene and geometry variables - world space diff --git a/assets/projects/202_pbr_camera/drawtexture.hlsl b/assets/projects/202_pbr_camera/drawtexture.hlsl index d376efa8..7d9d6aad 100644 --- a/assets/projects/202_pbr_camera/drawtexture.hlsl +++ b/assets/projects/202_pbr_camera/drawtexture.hlsl @@ -20,6 +20,7 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; +[shader("vertex")] VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) { VSOutput output = (VSOutput)0; @@ -36,10 +37,11 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } - float4 psmain(VSOutput input) : SV_Target - { +[shader("pixel")] +float4 psmain(VSOutput input) : SV_Target +{ float3 color = IBLEnvironmentMap.SampleLevel(IBLMapSampler, input.TexCoord, 0).xyz; color = ACESFilm(color); color = pow(color, 1 / 1.6); return float4(color, 1); - } +} diff --git a/assets/projects/202_pbr_camera/shaders.hlsl b/assets/projects/202_pbr_camera/shaders.hlsl index 0514a700..e2559023 100644 --- a/assets/projects/202_pbr_camera/shaders.hlsl +++ b/assets/projects/202_pbr_camera/shaders.hlsl @@ -65,6 +65,7 @@ struct VSOutput { float3 Bitangent : BITANGENT; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD, @@ -206,6 +207,7 @@ float3 ACESFilm(float3 x) return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { uint baseColorIdx = 5 * DrawParams.MaterialIndex + 0; diff --git a/assets/projects/203_pbr_align/drawtexture.hlsl b/assets/projects/203_pbr_align/drawtexture.hlsl index 2960f491..2ca04de2 100644 --- a/assets/projects/203_pbr_align/drawtexture.hlsl +++ b/assets/projects/203_pbr_align/drawtexture.hlsl @@ -20,13 +20,14 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; - VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) - { +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) +{ VSOutput output = (VSOutput)0; output.PositionCS = mul(SceneParams.MVP, float4(PositionOS, 1)); output.TexCoord = TexCoord; return output; - } +} // @@ -36,10 +37,11 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } - float4 psmain(VSOutput input) : SV_Target - { +[shader("pixel")] +float4 psmain(VSOutput input) : SV_Target +{ float3 color = IBLEnvironmentMap.SampleLevel(IBLMapSampler, input.TexCoord, 0).xyz; color = ACESFilm(color); color = pow(color, 1 / 1.6); return float4(color, 1); - } +} diff --git a/assets/projects/203_pbr_align/shaders.hlsl b/assets/projects/203_pbr_align/shaders.hlsl index 005fafe7..aa42dcf6 100644 --- a/assets/projects/203_pbr_align/shaders.hlsl +++ b/assets/projects/203_pbr_align/shaders.hlsl @@ -60,6 +60,7 @@ struct VSOutput { float3 Normal : NORMAL; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float3 Normal : NORMAL @@ -196,6 +197,7 @@ float3 ACESFilm(float3 x) return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { // Scene and geometry variables - world space diff --git a/assets/projects/251_pbr_explorer/drawtexture.hlsl b/assets/projects/251_pbr_explorer/drawtexture.hlsl index 48012021..40a24508 100644 --- a/assets/projects/251_pbr_explorer/drawtexture.hlsl +++ b/assets/projects/251_pbr_explorer/drawtexture.hlsl @@ -22,6 +22,7 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; +[shader("vertex")] VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) { VSOutput output = (VSOutput)0; @@ -38,6 +39,7 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_Target { float3 color = Textures[SceneParmas.IBLIndex].SampleLevel(Sampler0, input.TexCoord, 0).xyz; diff --git a/assets/projects/251_pbr_explorer/shaders.hlsl b/assets/projects/251_pbr_explorer/shaders.hlsl index b31c5e18..f91d121c 100644 --- a/assets/projects/251_pbr_explorer/shaders.hlsl +++ b/assets/projects/251_pbr_explorer/shaders.hlsl @@ -108,6 +108,7 @@ struct VSOutput { float3 Normal : NORMAL; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float3 Normal : NORMAL @@ -575,6 +576,7 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { // Scene and geometry variables - world space diff --git a/assets/projects/252_pbr_material_properties/drawtexture.hlsl b/assets/projects/252_pbr_material_properties/drawtexture.hlsl index 4815aff5..2db19429 100644 --- a/assets/projects/252_pbr_material_properties/drawtexture.hlsl +++ b/assets/projects/252_pbr_material_properties/drawtexture.hlsl @@ -13,6 +13,7 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; +[shader("vertex")] VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) { VSOutput output = (VSOutput)0; @@ -29,6 +30,7 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_Target { float3 color = IBLEnvironmentMap.SampleLevel(IBLMapSampler, input.TexCoord, 0).xyz; diff --git a/assets/projects/252_pbr_material_properties/shaders.hlsl b/assets/projects/252_pbr_material_properties/shaders.hlsl index 18b9d28f..0262d457 100644 --- a/assets/projects/252_pbr_material_properties/shaders.hlsl +++ b/assets/projects/252_pbr_material_properties/shaders.hlsl @@ -82,6 +82,7 @@ struct VSOutput { float3 Bitangent : BITANGENT; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float3 Normal : NORMAL, @@ -303,6 +304,7 @@ float3 ACESFilm(float3 x) return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { // Scene and geometry variables - world space diff --git a/assets/projects/253_pbr_material_textures/drawtexture.hlsl b/assets/projects/253_pbr_material_textures/drawtexture.hlsl index aba0abee..2a076268 100644 --- a/assets/projects/253_pbr_material_textures/drawtexture.hlsl +++ b/assets/projects/253_pbr_material_textures/drawtexture.hlsl @@ -20,6 +20,7 @@ struct VSOutput float2 TexCoord : TEXCOORD; }; +[shader("vertex")] VSOutput vsmain(float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD) { VSOutput output = (VSOutput)0; @@ -36,6 +37,7 @@ float3 ACESFilm(float3 x){ return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_Target { float3 color = Textures[SceneParmas.IBLIndex].SampleLevel(Sampler0, input.TexCoord, 0).xyz; diff --git a/assets/projects/253_pbr_material_textures/shaders.hlsl b/assets/projects/253_pbr_material_textures/shaders.hlsl index 89ea47b0..e3641052 100644 --- a/assets/projects/253_pbr_material_textures/shaders.hlsl +++ b/assets/projects/253_pbr_material_textures/shaders.hlsl @@ -79,6 +79,7 @@ struct VSOutput { float3 Bitangent : BITANGENT; }; +[shader("vertex")] VSOutput vsmain( float3 PositionOS : POSITION, float2 TexCoord : TEXCOORD, @@ -291,6 +292,7 @@ float3 ACESFilm(float3 x) return saturate((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14)); } +[shader("pixel")] float4 psmain(VSOutput input) : SV_TARGET { // Scene and geometry variables - world space diff --git a/cmake/slang.cmake b/cmake/slang.cmake new file mode 100644 index 00000000..9bf9af94 --- /dev/null +++ b/cmake/slang.cmake @@ -0,0 +1,21 @@ +cmake_minimum_required(VERSION 3.25) + +function(CopySharedLibs exe_target) + if (MSVC) + set(SlangDLL ${SLANG_DIR}/bin/slang.dll) + set(DestDir ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/$) + + if (NOT TARGET copy_shared_libs) + add_custom_target( + copy_shared_libs + COMMAND ${CMAKE_COMMAND} -E copy_if_different ${SlangDLL} ${DestDir} + COMMENT "Copying ${SlangDLL} ${DestDir}" + ) + + set_target_properties(copy_shared_libs PROPERTIES FOLDER "build_tasks") + endif() + + add_dependencies(${exe_target} copy_shared_libs) + endif() +endfunction() + diff --git a/projects/common/config.h b/projects/common/config.h index e450b3eb..e5ca81eb 100644 --- a/projects/common/config.h +++ b/projects/common/config.h @@ -45,8 +45,15 @@ using Microsoft::WRL::ComPtr; #define GREX_MAX_VERTEX_ATTRIBUTES 6 -#define GREX_BASE_FILE_NAME() \ - std::filesystem::path(__FILE__).filename().replace_extension("").string().c_str() +// clang-format off +#if defined(GREX_ENABLE_SLANG) + #define GREX_BASE_FILE_NAME() \ + (std::filesystem::path(__FILE__).filename().replace_extension("").string() + "_slang").c_str() +#else + #define GREX_BASE_FILE_NAME() \ + std::filesystem::path(__FILE__).filename().replace_extension("").string().c_str() +#endif +// clang-format on enum GREXFormat { diff --git a/projects/common/vk_renderer.cpp b/projects/common/vk_renderer.cpp index 39ee2776..af556f45 100644 --- a/projects/common/vk_renderer.cpp +++ b/projects/common/vk_renderer.cpp @@ -6,6 +6,11 @@ #include "glslang/Include/glslang_c_interface.h" #include "glslang/Public/resource_limits_c.h" +#if defined(GREX_ENABLE_SLANG) +#include "slang.h" +#include "slang-com-ptr.h" +#endif + #define VK_KHR_VALIDATION_LAYER_NAME "VK_LAYER_KHRONOS_validation" #define VK_QUEUE_MASK_ALL_TYPES (VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT | VK_QUEUE_TRANSFER_BIT) @@ -370,10 +375,7 @@ bool InitVulkan(VulkanRenderer* pRenderer, bool enableDebug, const VulkanFeature VkPhysicalDeviceTimelineSemaphoreFeatures timelineSemaphoreFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_TIMELINE_SEMAPHORE_FEATURES, &synchronization2Features}; timelineSemaphoreFeatures.timelineSemaphore = VK_TRUE; - VkPhysicalDeviceDescriptorBufferFeaturesEXT descriptorBufferFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_DESCRIPTOR_BUFFER_FEATURES_EXT, &timelineSemaphoreFeatures}; - descriptorBufferFeatures.descriptorBuffer = pRenderer->Features.EnableDescriptorBuffer ? VK_TRUE : VK_FALSE; - - VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, &descriptorBufferFeatures}; + VkPhysicalDeviceScalarBlockLayoutFeatures scalarBlockLayoutFeatures = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SCALAR_BLOCK_LAYOUT_FEATURES, &timelineSemaphoreFeatures}; scalarBlockLayoutFeatures.scalarBlockLayout = VK_TRUE; VkPhysicalDeviceRobustness2FeaturesEXT robustness2Features = {VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_ROBUSTNESS_2_FEATURES_EXT, &scalarBlockLayoutFeatures}; @@ -1969,7 +1971,9 @@ VkResult CreateDrawVertexColorPipeline( VkPipeline* pPipeline, VkCullModeFlags cullMode, VkPrimitiveTopology topologyType, - uint32_t pipelineFlags) + uint32_t pipelineFlags, + const char* vsEntryPoint, + const char* fsEntryPoint) { bool isInterleavedAttrs = pipelineFlags & VK_PIPELINE_FLAGS_INTERLEAVED_ATTRS; VkFormat rtv_format = GREX_DEFAULT_RTV_FORMAT; @@ -1981,11 +1985,11 @@ VkResult CreateDrawVertexColorPipeline( VkPipelineShaderStageCreateInfo shader_stages[2] = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO}; shader_stages[0].stage = VK_SHADER_STAGE_VERTEX_BIT; shader_stages[0].module = vsShaderModule; - shader_stages[0].pName = "main"; + shader_stages[0].pName = vsEntryPoint; shader_stages[1].sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stages[1].stage = VK_SHADER_STAGE_FRAGMENT_BIT; shader_stages[1].module = fsShaderModule; - shader_stages[1].pName = "main"; + shader_stages[1].pName = fsEntryPoint; VkVertexInputBindingDescription vertex_binding_desc[2] = {}; vertex_binding_desc[0].binding = 0; @@ -3356,6 +3360,7 @@ HRESULT CompileHLSL( const std::string& shaderSource, const std::string& entryPoint, const std::string& profile, + const CompilerOptions& options, std::vector* pSPIRV, std::string* pErrorMsg) { @@ -3450,9 +3455,329 @@ HRESULT CompileHLSL( pSPIRV->resize(wordCount); memcpy(pSPIRV->data(), pBuffer, bufferSize); + if (options.DumpShaderBinary && !options.ShaderBinaryPrefix.empty()) + { + std::string binaryName = options.ShaderBinaryPrefix + "_" + entryPoint + "_" + profile + ".spv"; + auto binaryPath = options.ShaderBinaryDir / binaryName; + + std::ofstream os(binaryPath, std::ios::binary); + if (os.is_open()) + { + os.write(pBuffer, bufferSize); + } + } + return S_OK; } +HRESULT CompileHLSL( + const std::string& shaderSource, + const std::string& entryPoint, + const std::string& profile, + std::vector* pSPIRV, + std::string* pErrorMsg) +{ + return CompileHLSL(shaderSource, entryPoint, profile, {}, pSPIRV, pErrorMsg); +} + +#if defined(GREX_ENABLE_SLANG) +CompileResult CompileSlang( + const std::string& shaderSource, + const std::string& entryPoint, + const std::string& profile, + const CompilerOptions& options, + std::vector* pSPIRV, + std::string* pErrorMsg) +{ + // Bail if entry point is empty and we're not compiling to a library + bool isTargetLibrary = profile.starts_with("lib_6_"); + if (!isTargetLibrary && entryPoint.empty()) + { + return COMPILE_ERROR_INVALID_ENTRY_POINT; + } + + Slang::ComPtr globalSession; + if (SLANG_FAILED(slang::createGlobalSession(globalSession.writeRef()))) + { + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + + slang::TargetDesc targetDesc = {}; + targetDesc.format = SLANG_SPIRV; + targetDesc.flags = SLANG_TARGET_FLAG_GENERATE_SPIRV_DIRECTLY; + // + // Disable profile for now since it's causing ISession::loadModuleFromSourceString to crash. + // + // targetDesc.profile = globalSession->findProfile(profile.c_str()); + + targetDesc.flags |= SLANG_TARGET_FLAG_GENERATE_WHOLE_PROGRAM; + + // Must be set in target desc for now + targetDesc.forceGLSLScalarBufferLayout = true; + + // Compiler options for Slang + std::vector compilerOptions; + { + // Define __spirv__ + { + slang::CompilerOptionEntry entry = {slang::CompilerOptionName::MacroDefine}; + entry.value.kind = slang::CompilerOptionValueKind::String; + entry.value.stringValue0 = "__spirv__"; + entry.value.stringValue1 = "1"; + + compilerOptions.push_back(entry); + } + + //// Force row major + //{ + // compilerOptions.push_back( + // slang::CompilerOptionEntry{ + // slang::CompilerOptionName::MatrixLayoutRow, + // slang::CompilerOptionValue{slang::CompilerOptionValueKind::Int, 1} + // }); + //} + + // Force Slang language to prevent any accidental interpretations as GLSL or HLSL + { + slang::CompilerOptionEntry entry = {slang::CompilerOptionName::Language}; + entry.value.stringValue0 = "slang"; + + compilerOptions.push_back(entry); + } + + // Force "main" entry point if requested + if (!options.ForceEntryPointMain) + { + compilerOptions.push_back( + slang::CompilerOptionEntry{ + slang::CompilerOptionName::VulkanUseEntryPointName, + slang::CompilerOptionValue{slang::CompilerOptionValueKind::Int, 1} + }); + } + + // Use unscoped enums + { + compilerOptions.push_back( + slang::CompilerOptionEntry{ + slang::CompilerOptionName::UnscopedEnum, + slang::CompilerOptionValue{slang::CompilerOptionValueKind::Int, 1} + }); + } + + // Force scalar block layout - this gets overwritten by forceGLSLScalarBufferLayout in + // the target desc currently. So we just set it there. + // + { + compilerOptions.push_back( + slang::CompilerOptionEntry{ + slang::CompilerOptionName::GLSLForceScalarLayout, + slang::CompilerOptionValue{slang::CompilerOptionValueKind::Int, 1} + }); + } + } + + slang::SessionDesc sessionDesc = {}; + sessionDesc.targets = &targetDesc; + sessionDesc.targetCount = 1; + sessionDesc.defaultMatrixLayoutMode = SLANG_MATRIX_LAYOUT_COLUMN_MAJOR; + sessionDesc.compilerOptionEntries = compilerOptions.data(); + sessionDesc.compilerOptionEntryCount = static_cast(compilerOptions.size()); + + Slang::ComPtr compileSession; + if (SLANG_FAILED(globalSession->createSession(sessionDesc, compileSession.writeRef()))) + { + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + + // Load source + slang::IModule* pSlangModule = nullptr; + { + Slang::ComPtr diagBlob; + + pSlangModule = compileSession->loadModuleFromSourceString("grex-module", "grex-path", shaderSource.c_str(), diagBlob.writeRef()); + if (pSlangModule == nullptr) + { + if (pErrorMsg != nullptr) + { + *pErrorMsg = std::string(static_cast(diagBlob->getBufferPointer()), diagBlob->getBufferSize()); + } + + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + } + + Slang::ComPtr spirvCode; + if (isTargetLibrary) + { + // + // NOTE: This may not be the most correct way to do it, but it works for now + // + + // Create compile request + std::unique_ptr compileRequest(nullptr, nullptr); + { + SlangCompileRequest* pCompileRequest = nullptr; + auto slangRes = compileSession->createCompileRequest(&pCompileRequest); + if (SLANG_FAILED(slangRes)) + { + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + + compileRequest = std::unique_ptr(pCompileRequest, spDestroyCompileRequest); + } + + // Add translation unit + auto index = compileRequest->addTranslationUnit(SLANG_SOURCE_LANGUAGE_SLANG, nullptr); + compileRequest->addTranslationUnitSourceString(index, "grex-path", shaderSource.c_str()); + + // Compile + auto slangRes = compileRequest->compile(); + if (SLANG_FAILED(slangRes)) + { + if (pErrorMsg != nullptr) + { + Slang::ComPtr diagBlob; + + slangRes = compileRequest->getDiagnosticOutputBlob(diagBlob.writeRef()); + if (SLANG_SUCCEEDED(slangRes)) + { + *pErrorMsg = std::string(static_cast(diagBlob->getBufferPointer()), diagBlob->getBufferSize()); + } + else + { + // Something has gone really wrong + assert(false && "failed to get diagnostic output blob"); + } + } + + return COMPILE_ERROR_COMPILE_FAILED; + } + + // Get SPIR-V + slangRes = compileRequest->getTargetCodeBlob(0, spirvCode.writeRef()); + if (SLANG_FAILED(slangRes)) + { + if (pErrorMsg != nullptr) + { + *pErrorMsg = "unable to retrieve SPIR-V blob for library"; + } + + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + } + else + { + // Load source + slang::IModule* pSlangModule = nullptr; + { + Slang::ComPtr diagBlob; + + pSlangModule = compileSession->loadModuleFromSourceString("grex-module", "", shaderSource.c_str(), diagBlob.writeRef()); + if (pSlangModule == nullptr) + { + if (pErrorMsg != nullptr) + { + *pErrorMsg = std::string(static_cast(diagBlob->getBufferPointer()), diagBlob->getBufferSize()); + } + + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + } + + // Components + std::vector components; + components.push_back(pSlangModule); + + // Entry points + if (!entryPoint.empty()) + { + Slang::ComPtr slangEntryPoint; + if (SLANG_FAILED(pSlangModule->findEntryPointByName(entryPoint.c_str(), slangEntryPoint.writeRef()))) + { + *pErrorMsg = "Couldn't find entry point by name"; + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + components.push_back(slangEntryPoint); + } + else + { + SlangInt32 slangEntryPointCount = pSlangModule->getDefinedEntryPointCount(); + for (SlangInt32 i = 0; i < slangEntryPointCount; ++i) + { + ComPtr slangEntryPoint; + if (SLANG_FAILED(pSlangModule->getDefinedEntryPoint(i, &slangEntryPoint))) + { + *pErrorMsg = "Couldn't get defined entry point"; + return COMPILE_ERROR_INTERNAL_COMPILER_ERROR; + } + components.push_back(slangEntryPoint.Get()); + } + } + + Slang::ComPtr composedProgram; + { + Slang::ComPtr diagBlob; + + auto slangRes = compileSession->createCompositeComponentType( + components.data(), + components.size(), + composedProgram.writeRef(), + diagBlob.writeRef()); + if (SLANG_FAILED(slangRes)) + { + if (pErrorMsg != nullptr) + { + *pErrorMsg = std::string(static_cast(diagBlob->getBufferPointer()), diagBlob->getBufferSize()); + } + + return COMPILE_ERROR_COMPILE_FAILED; + } + } + + // Get SPIR-V + { + Slang::ComPtr diagBlob; + + auto slangRes = composedProgram->getEntryPointCode( + 0, // entryPointIndex, + 0, // targetIndex, + spirvCode.writeRef(), + diagBlob.writeRef()); + if (SLANG_FAILED(slangRes)) + { + if (pErrorMsg != nullptr) + { + *pErrorMsg = std::string(static_cast(diagBlob->getBufferPointer()), diagBlob->getBufferSize()); + } + + return COMPILE_ERROR_LINK_FAILED; + } + } + } + + const char* pBuffer = static_cast(spirvCode->getBufferPointer()); + size_t bufferSize = static_cast(spirvCode->getBufferSize()); + size_t wordCount = bufferSize / 4; + + pSPIRV->resize(wordCount); + memcpy(pSPIRV->data(), pBuffer, bufferSize); + + if (options.DumpShaderBinary && !options.ShaderBinaryPrefix.empty()) + { + std::string binaryName = options.ShaderBinaryPrefix + "_" + entryPoint + "_" + profile + ".spv"; + auto binaryPath = options.ShaderBinaryDir / binaryName; + + std::ofstream os(binaryPath, std::ios::binary); + if (os.is_open()) + { + os.write(pBuffer, bufferSize); + } + } + + return COMPILE_SUCCESS; +} +#endif + void CreateDescriptor( VulkanRenderer* pRenderer, VulkanBufferDescriptor* pBufferDescriptor, diff --git a/projects/common/vk_renderer.h b/projects/common/vk_renderer.h index 431fae90..923a89ef 100644 --- a/projects/common/vk_renderer.h +++ b/projects/common/vk_renderer.h @@ -66,6 +66,11 @@ struct CompilerOptions uint32_t BindingShiftSampler = 0; uint32_t BindingShiftSSBO = 0; uint32_t BindingShiftUAV = 0; + + bool ForceEntryPointMain = false; + bool DumpShaderBinary = false; + std::filesystem::path ShaderBinaryDir = ""; + std::string ShaderBinaryPrefix = ""; }; #define GREX_DEFAULT_RTV_FORMAT VK_FORMAT_B8G8R8A8_UNORM @@ -361,7 +366,9 @@ VkResult CreateDrawVertexColorPipeline( VkPipeline* pPipeline, VkCullModeFlags cullMode = VK_CULL_MODE_BACK_BIT, VkPrimitiveTopology topologyType = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, - uint32_t pipelineFlags = 0); + uint32_t pipelineFlags = 0, + const char* vsEntryPoint = "main", + const char* fsEntryPoint = "main"); VkResult CreateDrawNormalPipeline( VulkanRenderer* pRenderer, @@ -459,6 +466,31 @@ HRESULT CompileHLSL( std::vector* pSPIRV, std::string* pErrorMsg); +HRESULT CompileHLSL( + const std::string& shaderSource, + const std::string& entryPoint, + const std::string& profile, + const CompilerOptions& options, + std::vector* pSPIRV, + std::string* pErrorMsg); + +HRESULT CompileHLSL( + const std::string& shaderSource, + const std::string& entryPoint, + const std::string& profile, + std::vector* pSPIRV, + std::string* pErrorMsg); + +#if defined(GREX_ENABLE_SLANG) +CompileResult CompileSlang( + const std::string& shaderSource, + const std::string& entryPoint, + const std::string& profile, + const CompilerOptions& options, + std::vector* pSPIRV, + std::string* pErrorMsg); +#endif + // Buffer void CreateDescriptor( VulkanRenderer* pRenderer, diff --git a/projects/common/window.cpp b/projects/common/window.cpp index 565e877d..7a22b836 100644 --- a/projects/common/window.cpp +++ b/projects/common/window.cpp @@ -789,6 +789,12 @@ fs::path GetExecutablePath() return path; } +fs::path GetExecutableDir() +{ + auto dir = GetExecutablePath().parent_path(); + return dir; +} + uint32_t GetProcessId() { uint32_t pid = UINT32_MAX; diff --git a/projects/common/window.h b/projects/common/window.h index 76367c88..56944b42 100644 --- a/projects/common/window.h +++ b/projects/common/window.h @@ -143,6 +143,7 @@ class GrexWindow }; fs::path GetExecutablePath(); +fs::path GetExecutableDir(); uint32_t GetProcessId(); std::vector LoadFile(const fs::path& absPath); diff --git a/projects/geometry/101_color_cube_vulkan/101_color_cube_vulkan.cpp b/projects/geometry/101_color_cube_vulkan/101_color_cube_vulkan.cpp index fb5139d1..4435e91a 100644 --- a/projects/geometry/101_color_cube_vulkan/101_color_cube_vulkan.cpp +++ b/projects/geometry/101_color_cube_vulkan/101_color_cube_vulkan.cpp @@ -28,6 +28,36 @@ using namespace glm; // ============================================================================= // Shader code // ============================================================================= +#if defined(GREX_ENABLE_SLANG) +const char* gShaders = R"( +struct CameraProperties { + float4x4 MVP; +}; + +[[vk::push_constant]] +ConstantBuffer Cam; + +struct VSOutput { + float4 PositionCS : SV_POSITION; + float3 Color : COLOR; +}; + +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float3 Color : COLOR0) +{ + VSOutput output = (VSOutput)0; + output.PositionCS = mul(Cam.MVP, float4(PositionOS, 1)); + output.Color = Color; + return output; +} + +[shader("pixel")] +float4 psmain(VSOutput input) : SV_TARGET +{ + return float4(input.Color, 1); +} +)"; +#else const char* gShaderVS = R"( #version 460 @@ -60,6 +90,7 @@ void main() FragColor = vec4(vertexColor, 1.0f); } )"; +#endif // ============================================================================= // Globals @@ -103,7 +134,28 @@ int main(int argc, char** argv) std::vector spirvVS; std::vector spirvFS; { - std::string errorMsg; + std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(gShaders, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(gShaders, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else CompileResult res = CompileGLSL(gShaderVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); if (res != COMPILE_SUCCESS) { @@ -119,10 +171,11 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (VS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* @@ -155,14 +208,26 @@ int main(int argc, char** argv) // // ************************************************************************* VkPipeline pipeline = VK_NULL_HANDLE; - CreateDrawVertexColorPipeline( +#if defined(GREX_ENABLE_SLANG) + const char* vsEntryPoint = "vsmain"; + const char* fsEntryPoint = "psmain"; +#else + const char* vsEntryPoint = "main"; + const char* fsEntryPoint = "main"; +#endif + CHECK_CALL(CreateDrawVertexColorPipeline( renderer.get(), pipelineLayout, moduleVS, moduleFS, GREX_DEFAULT_RTV_FORMAT, GREX_DEFAULT_DSV_FORMAT, - &pipeline); + &pipeline, + VK_CULL_MODE_BACK_BIT, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + 0, + vsEntryPoint, + fsEntryPoint)); // ************************************************************************* // Get descriptor buffer properties diff --git a/projects/geometry/101_color_cube_vulkan/CMakeLists.txt b/projects/geometry/101_color_cube_vulkan/CMakeLists.txt index 47c073ac..97aa26de 100644 --- a/projects/geometry/101_color_cube_vulkan/CMakeLists.txt +++ b/projects/geometry/101_color_cube_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -66,3 +66,78 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + CopySharedLibs(${TARGET_NAME}) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/102_cornell_box_vulkan/102_cornell_box_vulkan.cpp b/projects/geometry/102_cornell_box_vulkan/102_cornell_box_vulkan.cpp index e2b7ea81..146b2283 100644 --- a/projects/geometry/102_cornell_box_vulkan/102_cornell_box_vulkan.cpp +++ b/projects/geometry/102_cornell_box_vulkan/102_cornell_box_vulkan.cpp @@ -52,7 +52,61 @@ struct DrawParameters // ============================================================================= // Shader code // ============================================================================= -const char* gShadersVS = R"( +#if defined(GREX_ENABLE_SLANG) +const char* gShaders = R"( +struct CameraProperties { + float4x4 MVP; + float3 LightPosition; +}; + +struct DrawParameters { + uint MaterialIndex; +}; + +struct Material { + float3 Albedo; + uint recieveLight; +}; + +[[vk::push_constant]] +ConstantBuffer DrawParams; + +ConstantBuffer Camera : register(b0); +StructuredBuffer Materials : register(t2); + +struct VSOutput { + float4 PositionCS : SV_POSITION; + float3 PositionOS : POSITION; + float3 Normal : NORMAL; +}; + +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float3 Normal : NORMAL) +{ + VSOutput output = (VSOutput)0; + output.PositionCS = mul(Camera.MVP, float4(PositionOS, 1)); + output.PositionOS = PositionOS; + output.Normal = Normal; + return output; +} + +[shader("pixel")] +float4 psmain(VSOutput input) : SV_TARGET +{ + float3 lightDir = normalize(Camera.LightPosition - input.PositionOS); + float diffuse = 0.7 * saturate(dot(lightDir, input.Normal)); + + Material material = Materials[DrawParams.MaterialIndex]; + float3 color = material.Albedo; + if (material.recieveLight) { + color = (0.3 + diffuse) * material.Albedo; + } + + return float4(color, 1); +} +)"; +#else +const char* gShaderVS = R"( #version 460 layout(binding=0) uniform CameraProperties @@ -74,7 +128,7 @@ void main() outNormal = Normal; } )"; -const char* gShadersFS = R"( +const char* gShaderFS = R"( #version 460 layout(binding=0) uniform CameraProperties @@ -118,6 +172,7 @@ void main() FragColor = vec4(color, 1); } )"; +#endif // ============================================================================= // Globals @@ -167,28 +222,48 @@ int main(int argc, char** argv) std::vector spirvVS; std::vector spirvFS; { - std::string errorMsg; - CompileResult vkRes = CompileGLSL(gShadersVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(gShaders, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(gShaders, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + CompileResult res = CompileGLSL(gShaderVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" << "Shader compiler error (VS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } - vkRes = CompileGLSL(gShadersFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + res = CompileGLSL(gShaderFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } +#endif } // ************************************************************************* @@ -216,6 +291,13 @@ int main(int argc, char** argv) // Graphics pipeline state object // ************************************************************************* VkPipeline pipeline = VK_NULL_HANDLE; +#if defined(GREX_ENABLE_SLANG) + const char* vsEntryPoint = "vsmain"; + const char* fsEntryPoint = "psmain"; +#else + const char* vsEntryPoint = "main"; + const char* fsEntryPoint = "main"; +#endif CHECK_CALL(CreateDrawNormalPipeline( renderer.get(), pipelineLayout.PipelineLayout, @@ -223,7 +305,11 @@ int main(int argc, char** argv) moduleFS, GREX_DEFAULT_RTV_FORMAT, GREX_DEFAULT_DSV_FORMAT, - &pipeline)); + &pipeline, + false, + VK_CULL_MODE_BACK_BIT, + vsEntryPoint, + fsEntryPoint)); // ************************************************************************* // Geometry data @@ -512,7 +598,6 @@ void CreatePipelineLayout(VulkanRenderer* pRenderer, VulkanPipelineLayout* pLayo } VkDescriptorSetLayoutCreateInfo createInfo = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; - createInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; createInfo.bindingCount = CountU32(bindings); createInfo.pBindings = DataPtr(bindings); diff --git a/projects/geometry/102_cornell_box_vulkan/CMakeLists.txt b/projects/geometry/102_cornell_box_vulkan/CMakeLists.txt index d22a4f43..c1c71aab 100644 --- a/projects/geometry/102_cornell_box_vulkan/CMakeLists.txt +++ b/projects/geometry/102_cornell_box_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -66,3 +66,78 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + CopySharedLibs(${TARGET_NAME}) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/103_cone_vulkan/103_cone_vulkan.cpp b/projects/geometry/103_cone_vulkan/103_cone_vulkan.cpp index 8d746a8e..ccbd9809 100644 --- a/projects/geometry/103_cone_vulkan/103_cone_vulkan.cpp +++ b/projects/geometry/103_cone_vulkan/103_cone_vulkan.cpp @@ -32,7 +32,38 @@ struct Camera // ============================================================================= // Shader code // ============================================================================= -const char* gShadersVS = R"( +#if defined(GREX_ENABLE_SLANG) +const char* gShaders = R"( + +struct CameraProperties { + float4x4 MVP; +}; + +[[vk::push_constant]] +ConstantBuffer Cam; + +struct VSOutput { + float4 PositionCS : SV_POSITION; + float3 Color : COLOR; +}; + +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float3 Color : COLOR0) +{ + VSOutput output = (VSOutput)0; + output.PositionCS = mul(Cam.MVP, float4(PositionOS, 1)); + output.Color = Color; + return output; +} + +[shader("pixel")] +float4 psmain(VSOutput input) : SV_TARGET +{ + return float4(input.Color, 1); +} +)"; +#else +const char* gShaderVS = R"( #version 460 layout( push_constant ) uniform CameraProperties @@ -51,7 +82,7 @@ void main() outColor = Color; } )"; -const char* gShadersFS = R"( +const char* gShaderFS = R"( #version 460 in vec3 Color; @@ -63,6 +94,7 @@ void main() FragColor = vec4(Color, 1); } )"; +#endif // ============================================================================= // Globals @@ -106,28 +138,48 @@ int main(int argc, char** argv) std::vector spirvVS; std::vector spirvFS; { - std::string errorMsg; - CompileResult vkRes = CompileGLSL(gShadersVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(gShaders, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" << "Shader compiler error (VS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } - vkRes = CompileGLSL(gShadersFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + res = CompileSlang(gShaders, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } +#else + CompileResult res = CompileGLSL(gShaderVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileGLSL(gShaderFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#endif } // ************************************************************************* @@ -160,6 +212,13 @@ int main(int argc, char** argv) // // ************************************************************************* VkPipeline trianglePipelineState = VK_NULL_HANDLE; +#if defined(GREX_ENABLE_SLANG) + const char* vsEntryPoint = "vsmain"; + const char* fsEntryPoint = "psmain"; +#else + const char* vsEntryPoint = "main"; + const char* fsEntryPoint = "main"; +#endif CHECK_CALL(CreateDrawVertexColorPipeline( renderer.get(), pipelineLayout, @@ -167,7 +226,12 @@ int main(int argc, char** argv) moduleFS, GREX_DEFAULT_RTV_FORMAT, GREX_DEFAULT_DSV_FORMAT, - &trianglePipelineState)); + &trianglePipelineState, + VK_CULL_MODE_BACK_BIT, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + 0, + vsEntryPoint, + fsEntryPoint)); VkPipeline tbnDebugPipelineState; CHECK_CALL(CreateDrawVertexColorPipeline( @@ -180,7 +244,9 @@ int main(int argc, char** argv) &tbnDebugPipelineState, VK_CULL_MODE_NONE, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, - VK_PIPELINE_FLAGS_INTERLEAVED_ATTRS)); + VK_PIPELINE_FLAGS_INTERLEAVED_ATTRS, + vsEntryPoint, + fsEntryPoint)); // ************************************************************************* // Geometry data diff --git a/projects/geometry/103_cone_vulkan/CMakeLists.txt b/projects/geometry/103_cone_vulkan/CMakeLists.txt index ca639688..65787042 100644 --- a/projects/geometry/103_cone_vulkan/CMakeLists.txt +++ b/projects/geometry/103_cone_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -66,3 +66,78 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + CopySharedLibs(${TARGET_NAME}) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/104_debug_tbn_vulkan/104_debug_tbn_vulkan.cpp b/projects/geometry/104_debug_tbn_vulkan/104_debug_tbn_vulkan.cpp index e62593d0..be435ba0 100644 --- a/projects/geometry/104_debug_tbn_vulkan/104_debug_tbn_vulkan.cpp +++ b/projects/geometry/104_debug_tbn_vulkan/104_debug_tbn_vulkan.cpp @@ -32,7 +32,38 @@ struct Camera // ============================================================================= // Shader code // ============================================================================= -const char* gShadersVS = R"( +#if defined(GREX_ENABLE_SLANG) +const char* gShaders = R"( + +struct CameraProperties { + float4x4 MVP; +}; + +[[vk::push_constant]] +ConstantBuffer Cam; + +struct VSOutput { + float4 PositionCS : SV_POSITION; + float3 Color : COLOR; +}; + +[shader("vertex")] +VSOutput vsmain(float3 PositionOS : POSITION, float3 Color : COLOR0) +{ + VSOutput output = (VSOutput)0; + output.PositionCS = mul(Cam.MVP, float4(PositionOS, 1)); + output.Color = Color; + return output; +} + +[shader("pixel")] +float4 psmain(VSOutput input) : SV_TARGET +{ + return float4(input.Color, 1); +} +)"; +#else +const char* gShaderVS = R"( #version 460 layout( push_constant ) uniform CameraProperties @@ -51,7 +82,7 @@ void main() outColor = Color; } )"; -const char* gShadersFS = R"( +const char* gShaderFS = R"( #version 460 in vec3 Color; @@ -63,6 +94,7 @@ void main() FragColor = vec4(Color, 1); } )"; +#endif // ============================================================================= // Constants @@ -157,28 +189,49 @@ int main(int argc, char** argv) std::vector spirvVS; std::vector spirvFS; { - std::string errorMsg; - CompileResult vkRes = CompileGLSL(gShadersVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + + std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(gShaders, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(gShaders, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + CompileResult res = CompileGLSL(gShaderVS, VK_SHADER_STAGE_VERTEX_BIT, {}, &spirvVS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" << "Shader compiler error (VS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } - vkRes = CompileGLSL(gShadersFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); - if (vkRes != COMPILE_SUCCESS) + res = CompileGLSL(gShaderFS, VK_SHADER_STAGE_FRAGMENT_BIT, {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); - assert(false); return EXIT_FAILURE; } +#endif } // ************************************************************************* @@ -211,6 +264,13 @@ int main(int argc, char** argv) // // ************************************************************************* VkPipeline trianglePipelineState = VK_NULL_HANDLE; +#if defined(GREX_ENABLE_SLANG) + const char* vsEntryPoint = "vsmain"; + const char* fsEntryPoint = "psmain"; +#else + const char* vsEntryPoint = "main"; + const char* fsEntryPoint = "main"; +#endif CHECK_CALL(CreateDrawVertexColorPipeline( renderer.get(), pipelineLayout, @@ -218,7 +278,12 @@ int main(int argc, char** argv) moduleFS, GREX_DEFAULT_RTV_FORMAT, GREX_DEFAULT_DSV_FORMAT, - &trianglePipelineState)); + &trianglePipelineState, + VK_CULL_MODE_BACK_BIT, + VK_PRIMITIVE_TOPOLOGY_TRIANGLE_LIST, + 0, + vsEntryPoint, + fsEntryPoint)); VkPipeline tbnDebugPipelineState = VK_NULL_HANDLE; CHECK_CALL(CreateDrawVertexColorPipeline( @@ -231,7 +296,9 @@ int main(int argc, char** argv) &tbnDebugPipelineState, VK_CULL_MODE_NONE, VK_PRIMITIVE_TOPOLOGY_LINE_LIST, - VK_PIPELINE_FLAGS_INTERLEAVED_ATTRS)); + VK_PIPELINE_FLAGS_INTERLEAVED_ATTRS, + vsEntryPoint, + fsEntryPoint)); // ************************************************************************* // Geometry data diff --git a/projects/geometry/104_debug_tbn_vulkan/CMakeLists.txt b/projects/geometry/104_debug_tbn_vulkan/CMakeLists.txt index 7886481b..1524c0f5 100644 --- a/projects/geometry/104_debug_tbn_vulkan/CMakeLists.txt +++ b/projects/geometry/104_debug_tbn_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -77,3 +77,89 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${IMGUI_VULKAN_FILES} + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.h + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.c + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + CopySharedLibs(${TARGET_NAME}) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + TRIMESH_USE_MIKKTSPACE + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/MikkTSpace + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/110_mesh_shader_triangle_vulkan/110_mesh_shader_triangle_vulkan.cpp b/projects/geometry/110_mesh_shader_triangle_vulkan/110_mesh_shader_triangle_vulkan.cpp index 537a45d8..45add020 100644 --- a/projects/geometry/110_mesh_shader_triangle_vulkan/110_mesh_shader_triangle_vulkan.cpp +++ b/projects/geometry/110_mesh_shader_triangle_vulkan/110_mesh_shader_triangle_vulkan.cpp @@ -34,6 +34,7 @@ struct MeshOutput { float3 Color : COLOR; }; +[shader("mesh")] [outputtopology("triangle")] [numthreads(1, 1, 1)] void msmain(out indices uint3 triangles[1], out vertices MeshOutput vertices[3]) { @@ -50,6 +51,7 @@ void msmain(out indices uint3 triangles[1], out vertices MeshOutput vertices[3]) vertices[2].Color = float3(0.0, 0.0, 1.0); } +[shader("pixel")] float4 psmain(MeshOutput input) : SV_TARGET { return float4(input.Color, 1); @@ -96,6 +98,27 @@ int main(int argc, char** argv) std::vector spirvFS; { std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(gShaders, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(gShaders, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else auto hr = CompileHLSL(gShaders, "msmain", "ms_6_5", &spirvMS, &errorMsg); if (FAILED(hr)) { @@ -115,6 +138,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/110_mesh_shader_triangle_vulkan/CMakeLists.txt b/projects/geometry/110_mesh_shader_triangle_vulkan/CMakeLists.txt index da1bf7af..7df546fd 100644 --- a/projects/geometry/110_mesh_shader_triangle_vulkan/CMakeLists.txt +++ b/projects/geometry/110_mesh_shader_triangle_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -66,3 +66,76 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/111_mesh_shader_meshlets_vulkan/111_mesh_shader_meshlets_vulkan.cpp b/projects/geometry/111_mesh_shader_meshlets_vulkan/111_mesh_shader_meshlets_vulkan.cpp index 8d64036e..a23f22dc 100644 --- a/projects/geometry/111_mesh_shader_meshlets_vulkan/111_mesh_shader_meshlets_vulkan.cpp +++ b/projects/geometry/111_mesh_shader_meshlets_vulkan/111_mesh_shader_meshlets_vulkan.cpp @@ -74,12 +74,33 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; +#if defined(GREX_ENABLE_SLANG) + CompileResult res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else auto hr = CompileHLSL(source, "msmain", "ms_6_5", &spirvMS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; ss << "\n" - << "Shader compiler error (VS): " << errorMsg << "\n"; + << "Shader compiler error (MS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } @@ -93,6 +114,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/111_mesh_shader_meshlets_vulkan/CMakeLists.txt b/projects/geometry/111_mesh_shader_meshlets_vulkan/CMakeLists.txt index 8b362331..59c71528 100644 --- a/projects/geometry/111_mesh_shader_meshlets_vulkan/CMakeLists.txt +++ b/projects/geometry/111_mesh_shader_meshlets_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -69,3 +69,79 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/112_mesh_shader_amplification_vulkan/112_mesh_shader_amplification_vulkan.cpp b/projects/geometry/112_mesh_shader_amplification_vulkan/112_mesh_shader_amplification_vulkan.cpp index 8686e1e5..420d6cea 100644 --- a/projects/geometry/112_mesh_shader_amplification_vulkan/112_mesh_shader_amplification_vulkan.cpp +++ b/projects/geometry/112_mesh_shader_amplification_vulkan/112_mesh_shader_amplification_vulkan.cpp @@ -77,7 +77,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -106,6 +137,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/112_mesh_shader_amplification_vulkan/CMakeLists.txt b/projects/geometry/112_mesh_shader_amplification_vulkan/CMakeLists.txt index 095be8f4..8c152583 100644 --- a/projects/geometry/112_mesh_shader_amplification_vulkan/CMakeLists.txt +++ b/projects/geometry/112_mesh_shader_amplification_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -69,3 +69,79 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/113_mesh_shader_instancing_vulkan/113_mesh_shader_instancing_vulkan.cpp b/projects/geometry/113_mesh_shader_instancing_vulkan/113_mesh_shader_instancing_vulkan.cpp index 86d6d2e2..3ae0cd29 100644 --- a/projects/geometry/113_mesh_shader_instancing_vulkan/113_mesh_shader_instancing_vulkan.cpp +++ b/projects/geometry/113_mesh_shader_instancing_vulkan/113_mesh_shader_instancing_vulkan.cpp @@ -79,7 +79,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -108,6 +139,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/113_mesh_shader_instancing_vulkan/CMakeLists.txt b/projects/geometry/113_mesh_shader_instancing_vulkan/CMakeLists.txt index c43fa5bc..19f842ea 100644 --- a/projects/geometry/113_mesh_shader_instancing_vulkan/CMakeLists.txt +++ b/projects/geometry/113_mesh_shader_instancing_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,86 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/114_mesh_shader_culling_vulkan/114_mesh_shader_culling_vulkan.cpp b/projects/geometry/114_mesh_shader_culling_vulkan/114_mesh_shader_culling_vulkan.cpp index 6d5fa295..dbef2ce3 100644 --- a/projects/geometry/114_mesh_shader_culling_vulkan/114_mesh_shader_culling_vulkan.cpp +++ b/projects/geometry/114_mesh_shader_culling_vulkan/114_mesh_shader_culling_vulkan.cpp @@ -169,7 +169,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -198,6 +229,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/114_mesh_shader_culling_vulkan/CMakeLists.txt b/projects/geometry/114_mesh_shader_culling_vulkan/CMakeLists.txt index 9685e062..7e927b24 100644 --- a/projects/geometry/114_mesh_shader_culling_vulkan/CMakeLists.txt +++ b/projects/geometry/114_mesh_shader_culling_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,86 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/115_mesh_shader_lod_vulkan/115_mesh_shader_lod_vulkan.cpp b/projects/geometry/115_mesh_shader_lod_vulkan/115_mesh_shader_lod_vulkan.cpp index 8079b1d2..c4bcc9d2 100644 --- a/projects/geometry/115_mesh_shader_lod_vulkan/115_mesh_shader_lod_vulkan.cpp +++ b/projects/geometry/115_mesh_shader_lod_vulkan/115_mesh_shader_lod_vulkan.cpp @@ -92,7 +92,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -121,6 +152,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/115_mesh_shader_lod_vulkan/CMakeLists.txt b/projects/geometry/115_mesh_shader_lod_vulkan/CMakeLists.txt index f03384c5..9a8166b3 100644 --- a/projects/geometry/115_mesh_shader_lod_vulkan/CMakeLists.txt +++ b/projects/geometry/115_mesh_shader_lod_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,86 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/116_mesh_shader_calc_lod_vulkan/116_mesh_shader_calc_lod_vulkan.cpp b/projects/geometry/116_mesh_shader_calc_lod_vulkan/116_mesh_shader_calc_lod_vulkan.cpp index 8a4c695f..e96de8c3 100644 --- a/projects/geometry/116_mesh_shader_calc_lod_vulkan/116_mesh_shader_calc_lod_vulkan.cpp +++ b/projects/geometry/116_mesh_shader_calc_lod_vulkan/116_mesh_shader_calc_lod_vulkan.cpp @@ -100,7 +100,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -129,6 +160,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/116_mesh_shader_calc_lod_vulkan/CMakeLists.txt b/projects/geometry/116_mesh_shader_calc_lod_vulkan/CMakeLists.txt index dafa6821..884a3731 100644 --- a/projects/geometry/116_mesh_shader_calc_lod_vulkan/CMakeLists.txt +++ b/projects/geometry/116_mesh_shader_calc_lod_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -81,3 +81,87 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() + diff --git a/projects/geometry/117_mesh_shader_cull_lod_vulkan/117_mesh_shader_cull_lod_vulkan.cpp b/projects/geometry/117_mesh_shader_cull_lod_vulkan/117_mesh_shader_cull_lod_vulkan.cpp index cc68f1dc..7d2051a3 100644 --- a/projects/geometry/117_mesh_shader_cull_lod_vulkan/117_mesh_shader_cull_lod_vulkan.cpp +++ b/projects/geometry/117_mesh_shader_cull_lod_vulkan/117_mesh_shader_cull_lod_vulkan.cpp @@ -181,7 +181,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -210,6 +241,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/117_mesh_shader_cull_lod_vulkan/CMakeLists.txt b/projects/geometry/117_mesh_shader_cull_lod_vulkan/CMakeLists.txt index 2f10db1b..a18ade3d 100644 --- a/projects/geometry/117_mesh_shader_cull_lod_vulkan/CMakeLists.txt +++ b/projects/geometry/117_mesh_shader_cull_lod_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,86 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/118_mesh_shader_vertex_attrs_vulkan.cpp b/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/118_mesh_shader_vertex_attrs_vulkan.cpp index 78e1d4b8..3e1f6e0c 100644 --- a/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/118_mesh_shader_vertex_attrs_vulkan.cpp +++ b/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/118_mesh_shader_vertex_attrs_vulkan.cpp @@ -105,7 +105,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -134,6 +165,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/CMakeLists.txt b/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/CMakeLists.txt index 5cfea4a4..3d6c5dc7 100644 --- a/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/CMakeLists.txt +++ b/projects/geometry/118_mesh_shader_vertex_attrs_vulkan/CMakeLists.txt @@ -5,7 +5,7 @@ project(118_mesh_shader_vertex_attrs_vulkan) set(TARGET_NAME ${PROJECT_NAME}) add_executable( - ${PROJECT_NAME} + ${TARGET_NAME} ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h @@ -21,7 +21,7 @@ add_executable( ${IMGUI_VULKAN_FILES} ) -set_target_properties(${PROJECT_NAME} PROPERTIES FOLDER "geometry") +set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") target_compile_definitions( ${TARGET_NAME} @@ -77,3 +77,85 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/geometry/119_mesh_shader_vertex_bary_vulkan/119_mesh_shader_vertex_bary_vulkan.cpp b/projects/geometry/119_mesh_shader_vertex_bary_vulkan/119_mesh_shader_vertex_bary_vulkan.cpp index eeb75df2..22aff736 100644 --- a/projects/geometry/119_mesh_shader_vertex_bary_vulkan/119_mesh_shader_vertex_bary_vulkan.cpp +++ b/projects/geometry/119_mesh_shader_vertex_bary_vulkan/119_mesh_shader_vertex_bary_vulkan.cpp @@ -112,7 +112,38 @@ int main(int argc, char** argv) assert((!source.empty()) && "no shader source!"); std::string errorMsg; - auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(source, "asmain", "as_6_5", {}, &spirvAS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (AS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "msmain", "ms_6_5", {}, &spirvMS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (MS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } + + res = CompileSlang(source, "psmain", "ps_6_5", {}, &spirvFS, &errorMsg); + if (res != COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + return EXIT_FAILURE; + } +#else + auto hr = CompileHLSL(source, "asmain", "as_6_5", &spirvAS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -141,6 +172,7 @@ int main(int argc, char** argv) GREX_LOG_ERROR(ss.str().c_str()); return EXIT_FAILURE; } +#endif } // ************************************************************************* diff --git a/projects/geometry/119_mesh_shader_vertex_bary_vulkan/CMakeLists.txt b/projects/geometry/119_mesh_shader_vertex_bary_vulkan/CMakeLists.txt index 7841b5ec..167e8bc8 100644 --- a/projects/geometry/119_mesh_shader_vertex_bary_vulkan/CMakeLists.txt +++ b/projects/geometry/119_mesh_shader_vertex_bary_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,86 @@ elseif(LINUX) "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" ) endif() + +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${TARGET_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/camera.h + ${GREX_PROJECTS_COMMON_DIR}/camera.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "geometry") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_VULKAN + GREX_ENABLE_SLANG + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + meshoptimizer + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/pbr/201_pbr_spheres_vulkan/201_pbr_spheres_vulkan.cpp b/projects/pbr/201_pbr_spheres_vulkan/201_pbr_spheres_vulkan.cpp index 6bcd6635..e5c8ded5 100644 --- a/projects/pbr/201_pbr_spheres_vulkan/201_pbr_spheres_vulkan.cpp +++ b/projects/pbr/201_pbr_spheres_vulkan/201_pbr_spheres_vulkan.cpp @@ -153,8 +153,36 @@ int main(int argc, char** argv) { std::string shaderSource = LoadString("projects/201_pbr_spheres/shaders.hlsl"); + CompilerOptions options = {}; + options.DumpShaderBinary = true; + options.ShaderBinaryDir = GetExecutableDir(); + options.ShaderBinaryPrefix = GREX_BASE_FILE_NAME(); + std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", options, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", options, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", options, &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -165,7 +193,7 @@ int main(int argc, char** argv) return EXIT_FAILURE; } - hr = CompileHLSL(shaderSource, "psmain", "ps_6_0", &spirvFS, &errorMsg); + hr = CompileHLSL(shaderSource, "psmain", "ps_6_0", options, &spirvFS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -175,6 +203,7 @@ int main(int argc, char** argv) assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; @@ -207,7 +236,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &drawTextureSpirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &drawTextureSpirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -228,6 +280,7 @@ int main(int argc, char** argv) assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule drawTextureShaderModuleVS = VK_NULL_HANDLE; @@ -783,7 +836,6 @@ void CreatePBRPipeline(VulkanRenderer* pRenderer, VulkanPipelineLayout* pLayout) } VkDescriptorSetLayoutCreateInfo createInfo = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; - createInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; createInfo.bindingCount = CountU32(bindings); createInfo.pBindings = DataPtr(bindings); @@ -835,7 +887,6 @@ void CreateEnvironmentPipeline(VulkanRenderer* pRenderer, VulkanPipelineLayout* } VkDescriptorSetLayoutCreateInfo createInfo = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO}; - createInfo.flags = VK_DESCRIPTOR_SET_LAYOUT_CREATE_DESCRIPTOR_BUFFER_BIT_EXT; createInfo.bindingCount = CountU32(bindings); createInfo.pBindings = DataPtr(bindings); diff --git a/projects/pbr/201_pbr_spheres_vulkan/CMakeLists.txt b/projects/pbr/201_pbr_spheres_vulkan/CMakeLists.txt index 80b589de..ccd36f28 100644 --- a/projects/pbr/201_pbr_spheres_vulkan/CMakeLists.txt +++ b/projects/pbr/201_pbr_spheres_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -72,3 +72,84 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${IMGUI_INC_DIR} + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/pbr/202_pbr_camera_vulkan/202_pbr_camera_vulkan.cpp b/projects/pbr/202_pbr_camera_vulkan/202_pbr_camera_vulkan.cpp index 416a6a4b..0300d976 100644 --- a/projects/pbr/202_pbr_camera_vulkan/202_pbr_camera_vulkan.cpp +++ b/projects/pbr/202_pbr_camera_vulkan/202_pbr_camera_vulkan.cpp @@ -179,7 +179,30 @@ int main(int argc, char** argv) std::string shaderSource = LoadString("projects/202_pbr_camera/shaders.hlsl"); std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -195,11 +218,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; @@ -232,7 +256,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &drawTextureSpirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &drawTextureSpirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -248,11 +295,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule drawTextureShaderModuleVS = VK_NULL_HANDLE; diff --git a/projects/pbr/202_pbr_camera_vulkan/CMakeLists.txt b/projects/pbr/202_pbr_camera_vulkan/CMakeLists.txt index 9aa8e277..77daf349 100644 --- a/projects/pbr/202_pbr_camera_vulkan/CMakeLists.txt +++ b/projects/pbr/202_pbr_camera_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -80,3 +80,87 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.h + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.c + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/MikkTSpace + ${IMGUI_INC_DIR} + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/pbr/203_pbr_align_vulkan/203_pbr_align_vulkan.cpp b/projects/pbr/203_pbr_align_vulkan/203_pbr_align_vulkan.cpp index 5d83fa79..9a95ea54 100644 --- a/projects/pbr/203_pbr_align_vulkan/203_pbr_align_vulkan.cpp +++ b/projects/pbr/203_pbr_align_vulkan/203_pbr_align_vulkan.cpp @@ -154,7 +154,30 @@ int main(int argc, char** argv) std::string shaderSource = LoadString("projects/203_pbr_align/shaders.hlsl"); std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -175,6 +198,7 @@ int main(int argc, char** argv) assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; @@ -207,7 +231,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &drawTextureSpirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &drawTextureSpirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -228,6 +275,7 @@ int main(int argc, char** argv) assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule drawTextureShaderModuleVS = VK_NULL_HANDLE; diff --git a/projects/pbr/203_pbr_align_vulkan/CMakeLists.txt b/projects/pbr/203_pbr_align_vulkan/CMakeLists.txt index 8b034094..bbc014c5 100644 --- a/projects/pbr/203_pbr_align_vulkan/CMakeLists.txt +++ b/projects/pbr/203_pbr_align_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -72,3 +72,84 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${IMGUI_INC_DIR} + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/pbr/251_pbr_explorer_vulkan/251_pbr_explorer_vulkan.cpp b/projects/pbr/251_pbr_explorer_vulkan/251_pbr_explorer_vulkan.cpp index c178914f..c445c361 100644 --- a/projects/pbr/251_pbr_explorer_vulkan/251_pbr_explorer_vulkan.cpp +++ b/projects/pbr/251_pbr_explorer_vulkan/251_pbr_explorer_vulkan.cpp @@ -294,7 +294,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -310,11 +333,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; @@ -347,7 +371,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &drawTextureSpirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &drawTextureSpirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -363,11 +410,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule drawTextureShaderModuleVS = VK_NULL_HANDLE; diff --git a/projects/pbr/251_pbr_explorer_vulkan/CMakeLists.txt b/projects/pbr/251_pbr_explorer_vulkan/CMakeLists.txt index 7acd991c..49c3bfc8 100644 --- a/projects/pbr/251_pbr_explorer_vulkan/CMakeLists.txt +++ b/projects/pbr/251_pbr_explorer_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -72,3 +72,85 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${IMGUI_INC_DIR} + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() + diff --git a/projects/pbr/252_pbr_material_properties_vulkan/252_pbr_material_properties_vulkan.cpp b/projects/pbr/252_pbr_material_properties_vulkan/252_pbr_material_properties_vulkan.cpp index c49c24ef..76bff290 100644 --- a/projects/pbr/252_pbr_material_properties_vulkan/252_pbr_material_properties_vulkan.cpp +++ b/projects/pbr/252_pbr_material_properties_vulkan/252_pbr_material_properties_vulkan.cpp @@ -173,7 +173,30 @@ int main(int argc, char** argv) std::string shaderSource = LoadString("projects/252_pbr_material_properties/shaders.hlsl"); std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -189,11 +212,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; diff --git a/projects/pbr/252_pbr_material_properties_vulkan/CMakeLists.txt b/projects/pbr/252_pbr_material_properties_vulkan/CMakeLists.txt index 0e56f7cb..ca0a5073 100644 --- a/projects/pbr/252_pbr_material_properties_vulkan/CMakeLists.txt +++ b/projects/pbr/252_pbr_material_properties_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -72,3 +72,84 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${IMGUI_INC_DIR} + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/projects/pbr/253_pbr_material_textures_vulkan/253_pbr_material_textures_vulkan.cpp b/projects/pbr/253_pbr_material_textures_vulkan/253_pbr_material_textures_vulkan.cpp index 31bf25e6..7ab6e565 100644 --- a/projects/pbr/253_pbr_material_textures_vulkan/253_pbr_material_textures_vulkan.cpp +++ b/projects/pbr/253_pbr_material_textures_vulkan/253_pbr_material_textures_vulkan.cpp @@ -206,7 +206,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &spirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &spirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &spirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -222,11 +245,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule shaderModuleVS = VK_NULL_HANDLE; @@ -259,7 +283,30 @@ int main(int argc, char** argv) } std::string errorMsg; - HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); +#if defined(GREX_ENABLE_SLANG) + auto res = CompileSlang(shaderSource, "vsmain", "vs_6_0", {}, &drawTextureSpirvVS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (VS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } + + res = CompileSlang(shaderSource, "psmain", "ps_6_0", {}, &drawTextureSpirvFS, &errorMsg); + if (res != CompileResult::COMPILE_SUCCESS) + { + std::stringstream ss; + ss << "\n" + << "Shader compiler error (FS): " << errorMsg << "\n"; + GREX_LOG_ERROR(ss.str().c_str()); + assert(false); + return EXIT_FAILURE; + } +#else + HRESULT hr = CompileHLSL(shaderSource, "vsmain", "vs_6_0", &drawTextureSpirvVS, &errorMsg); if (FAILED(hr)) { std::stringstream ss; @@ -275,11 +322,12 @@ int main(int argc, char** argv) { std::stringstream ss; ss << "\n" - << "Shader compiler error (PS): " << errorMsg << "\n"; + << "Shader compiler error (FS): " << errorMsg << "\n"; GREX_LOG_ERROR(ss.str().c_str()); assert(false); return EXIT_FAILURE; } +#endif } VkShaderModule drawTextureShaderModuleVS = VK_NULL_HANDLE; diff --git a/projects/pbr/253_pbr_material_textures_vulkan/CMakeLists.txt b/projects/pbr/253_pbr_material_textures_vulkan/CMakeLists.txt index 3b4aded3..87a9c7f2 100644 --- a/projects/pbr/253_pbr_material_textures_vulkan/CMakeLists.txt +++ b/projects/pbr/253_pbr_material_textures_vulkan/CMakeLists.txt @@ -6,7 +6,7 @@ set(TARGET_NAME ${PROJECT_NAME}) add_executable( ${TARGET_NAME} - ${TARGET_NAME}.cpp + ${PROJECT_NAME}.cpp ${GREX_PROJECTS_COMMON_DIR}/config.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp @@ -76,3 +76,88 @@ elseif(LINUX) ) endif() +################################################################################ + +if (GREX_ENABLE_SLANG) + set(TARGET_NAME "${PROJECT_NAME}_slang") + + add_executable( + ${TARGET_NAME} + ${PROJECT_NAME}.cpp + ${GREX_PROJECTS_COMMON_DIR}/config.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.h + ${GREX_PROJECTS_COMMON_DIR}/vk_renderer.cpp + ${GREX_PROJECTS_COMMON_DIR}/window.h + ${GREX_PROJECTS_COMMON_DIR}/window.cpp + ${GREX_PROJECTS_COMMON_DIR}/bitmap.h + ${GREX_PROJECTS_COMMON_DIR}/bitmap.cpp + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.h + ${GREX_PROJECTS_COMMON_DIR}/tri_mesh.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/resource_limits_c.cpp + ${GREX_THIRD_PARTY_DIR}/glslang/StandAlone/ResourceLimits.cpp + ${IMGUI_VULKAN_FILES} + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.h + ${GREX_THIRD_PARTY_DIR}/MikkTSpace/mikktspace.c + ) + + set_target_properties(${TARGET_NAME} PROPERTIES FOLDER "pbr") + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC ENABLE_IMGUI_VULKAN + TRIMESH_USE_MIKKTSPACE + GREX_ENABLE_VULKAN + ) + + target_compile_definitions( + ${TARGET_NAME} + PUBLIC GREX_ENABLE_SLANG + ) + + target_include_directories( + ${TARGET_NAME} + PUBLIC ${GREX_PROJECTS_COMMON_DIR} + ${GREX_THIRD_PARTY_DIR}/glslang # This needs to come before ${VULKAN_INCLUDE_DIR} + ${VULKAN_INCLUDE_DIR} + ${GREX_THIRD_PARTY_DIR}/VulkanMemoryAllocator/include + ${GREX_THIRD_PARTY_DIR}/glm + ${GREX_THIRD_PARTY_DIR}/stb + ${GREX_THIRD_PARTY_DIR}/tinyobjloader + ${IMGUI_INC_DIR} + ${GREX_THIRD_PARTY_DIR}/MikkTSpace + ${SLANG_INCLUDE_DIR} + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC glfw + glslang + SPIRV + ) + + if(WIN32) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_WIN32_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/vulkan-1.lib" + "${VULKAN_LIBRARY_DIR}/dxcompiler.lib" + "${SLANG_LIBRARY_DIR}/slang.lib" + ) + elseif(LINUX) + target_compile_definitions( + ${TARGET_NAME} + PUBLIC VK_USE_PLATFORM_XCB_KHR + ) + + target_link_libraries( + ${TARGET_NAME} + PUBLIC "${VULKAN_LIBRARY_DIR}/libvulkan.so" + "${VULKAN_LIBRARY_DIR}/libdxcompiler.so" + "${SLANG_LIBRARY_DIR}/libslang.so" + ) + endif() +endif() diff --git a/third_party/VulkanMemoryAllocator b/third_party/VulkanMemoryAllocator index 8b87b6cb..871913da 160000 --- a/third_party/VulkanMemoryAllocator +++ b/third_party/VulkanMemoryAllocator @@ -1 +1 @@ -Subproject commit 8b87b6cbf765d2b4d6cf66a06cc9004e11c096c4 +Subproject commit 871913da6a4b132b567d7b65c509600363c0041e