diff --git a/pkgs/by-name/sh/shader-slang/1-find-packages.patch b/pkgs/by-name/sh/shader-slang/1-find-packages.patch new file mode 100644 index 0000000000000..2cab123bc9ff9 --- /dev/null +++ b/pkgs/by-name/sh/shader-slang/1-find-packages.patch @@ -0,0 +1,77 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index dc281211..c36b9bcb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -154,6 +154,8 @@ advanced_option( + "Build using system unordered dense" + OFF + ) ++advanced_option(SLANG_USE_SYSTEM_SPIRV_TOOLS "Build using system SPIR-V tools library" OFF) ++advanced_option(SLANG_USE_SYSTEM_GLSLANG "Build using system glslang library" OFF) + + option( + SLANG_SPIRV_HEADERS_INCLUDE_DIR +@@ -289,6 +291,34 @@ if(${SLANG_USE_SYSTEM_UNORDERED_DENSE}) + find_package(unordered_dense CONFIG QUIET) + endif() + ++if(${SLANG_USE_SYSTEM_MINIZ}) ++ find_package(miniz REQUIRED) ++ add_library(miniz ALIAS miniz::miniz) ++endif() ++ ++if(${SLANG_USE_SYSTEM_LZ4}) ++ find_package(lz4 REQUIRED) ++ add_library(lz4_static ALIAS LZ4::lz4) ++endif() ++ ++if(${SLANG_USE_SYSTEM_VULKAN_HEADERS}) ++ find_package(VulkanHeaders REQUIRED) ++endif() ++ ++if(${SLANG_USE_SYSTEM_SPIRV_HEADERS}) ++ find_package(SPIRV-Headers REQUIRED) ++ add_library(SPIRV-Headers ALIAS SPIRV-Headers::SPIRV-Headers) ++endif() ++ ++if(${SLANG_USE_SYSTEM_SPIRV_TOOLS}) ++ find_package(SPIRV-Tools REQUIRED) ++endif() ++ ++if(${SLANG_USE_SYSTEM_GLSLANG}) ++ find_package(glslang REQUIRED) ++ add_library(glslang ALIAS glslang::glslang) ++endif() ++ + add_subdirectory(external) + + # webgpu_dawn is only available as a fetched shared library, since Dawn's nested source +diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt +index 43105a5f..8b9c0f14 100644 +--- a/external/CMakeLists.txt ++++ b/external/CMakeLists.txt +@@ -73,19 +73,24 @@ if(NOT ${SLANG_USE_SYSTEM_SPIRV_HEADERS}) + endif() + + if(SLANG_ENABLE_SLANG_GLSLANG) ++if(NOT ${SLANG_USE_SYSTEM_SPIRV_TOOLS}) + # SPIRV-Tools + set(SPIRV_TOOLS_BUILD_STATIC ON) + set(SPIRV_WERROR OFF) + set(SPIRV_HEADER_DIR "${CMAKE_CURRENT_LIST_DIR}/spirv-headers/") + set(SPIRV_SKIP_TESTS ON) + add_subdirectory(spirv-tools EXCLUDE_FROM_ALL ${system}) ++endif() + ++if(NOT ${SLANG_USE_SYSTEM_GLSLANG}) + # glslang + set(SKIP_GLSLANG_INSTALL ON) + set(ENABLE_OPT ON) + set(ENABLE_PCH OFF) ++ set(ALLOW_EXTERNAL_SPIRV_TOOLS ${SLANG_USE_SYSTEM_SPIRV_TOOLS}) + add_subdirectory(glslang EXCLUDE_FROM_ALL ${system}) + endif() ++endif() + + # imgui + add_library(imgui INTERFACE) diff --git a/pkgs/by-name/sh/shader-slang/2-shared-llvm.patch b/pkgs/by-name/sh/shader-slang/2-shared-llvm.patch new file mode 100644 index 0000000000000..587724e648722 --- /dev/null +++ b/pkgs/by-name/sh/shader-slang/2-shared-llvm.patch @@ -0,0 +1,27 @@ +diff --git a/cmake/LLVM.cmake b/cmake/LLVM.cmake +index 3c7c1b54..7f66d6bd 100644 +--- a/cmake/LLVM.cmake ++++ b/cmake/LLVM.cmake +@@ -7,7 +7,7 @@ function(llvm_target_from_components target_name) + ${components} + ) + add_library(${target_name} INTERFACE) +- target_link_libraries(${target_name} INTERFACE ${llvm_libs}) ++ target_link_libraries(${target_name} INTERFACE LLVM) + target_include_directories( + ${target_name} + SYSTEM +@@ -66,12 +66,7 @@ function(fetch_or_build_slang_llvm) + llvm_target_from_components(llvm-dep filecheck native orcjit) + clang_target_from_libs( + clang-dep +- clangBasic +- clangCodeGen +- clangDriver +- clangLex +- clangFrontend +- clangFrontendTool ++ clang-cpp + ) + slang_add_target( + source/slang-llvm diff --git a/pkgs/by-name/sh/shader-slang/3-glslang-15.patch b/pkgs/by-name/sh/shader-slang/3-glslang-15.patch new file mode 100644 index 0000000000000..602cabc0c5d6a --- /dev/null +++ b/pkgs/by-name/sh/shader-slang/3-glslang-15.patch @@ -0,0 +1,45 @@ +diff --git a/source/slang-glslang/slang-glslang.cpp b/source/slang-glslang/slang-glslang.cpp +index 4abcada6..0f63a64e 100644 +--- a/source/slang-glslang/slang-glslang.cpp ++++ b/source/slang-glslang/slang-glslang.cpp +@@ -1,8 +1,7 @@ + // slang-glslang.cpp + #include "slang-glslang.h" + +-#include "SPIRV/GlslangToSpv.h" +-#include "glslang/MachineIndependent/localintermediate.h" ++#include "glslang/SPIRV/GlslangToSpv.h" + #include "glslang/Public/ShaderLang.h" + #include "slang.h" + #include "spirv-tools/libspirv.h" +@@ -17,6 +16,7 @@ + #include + #include + #include ++#include + + // This is a wrapper to allow us to run the `glslang` compiler + // in a controlled fashion. +@@ -718,6 +718,11 @@ static int glslang_compileGLSLToSPIRV(glslang_CompileRequest_1_2 request) + return 1; + } + ++ if (debugLevel == SLANG_DEBUG_INFO_LEVEL_MAXIMAL) ++ { ++ shader->addSourceText(sourceText, sourceTextLength); ++ } ++ + if (request.entryPointName && strlen(request.entryPointName)) + shader->setEntryPoint(request.entryPointName); + +@@ -741,10 +746,6 @@ static int glslang_compileGLSLToSPIRV(glslang_CompileRequest_1_2 request) + auto stageIntermediate = program->getIntermediate((EShLanguage)stage); + if (!stageIntermediate) + continue; +- if (debugLevel == SLANG_DEBUG_INFO_LEVEL_MAXIMAL) +- { +- stageIntermediate->addSourceText(sourceText, sourceTextLength); +- } + + std::vector spirv; + spv::SpvBuildLogger logger; diff --git a/pkgs/by-name/sh/shader-slang/package.nix b/pkgs/by-name/sh/shader-slang/package.nix new file mode 100644 index 0000000000000..9c75023117772 --- /dev/null +++ b/pkgs/by-name/sh/shader-slang/package.nix @@ -0,0 +1,158 @@ +{ + lib, + stdenv, + fetchFromGitHub, + cmake, + ninja, + python3, + miniz, + lz4, + libxml2, + libX11, + spirv-headers, + glslang, + llvmPackages_13, + versionCheckHook, + gitUpdater, + + # Required for compiling to SPIR-V or GLSL + withGlslang ? true, + # Can be used for compiling shaders to CPU targets, see: + # https://github.com/shader-slang/slang/blob/master/docs/cpu-target.md + # If `withLLVM` is disabled, Slang will fall back to the C++ compiler found + # in the environment, if one exists. + withLLVM ? false, + # Dynamically link against libllvm and libclang++ (upstream defaults to static) + withSharedLLVM ? withLLVM, +}: + +stdenv.mkDerivation (finalAttrs: { + pname = "shader-slang"; + version = "2025.2"; + + src = fetchFromGitHub { + owner = "shader-slang"; + repo = "slang"; + tag = "v${finalAttrs.version}"; + hash = "sha256-H/ePYu6o926M22zussW1f15iYRJCq29TeNJzBD0eAao="; + fetchSubmodules = true; + }; + + patches = + [ + # Slang's build definitions do not support using system provided cmake packages + # for its dependencies. + # While it does come with "SLANG_USE_SYSTEM_XYZ" flags, these expect Slang to be + # imported into some other CMake build that already provides the necessary target. + # This patch adds the required `find_package` calls and sets up target aliases where needed. + ./1-find-packages.patch + ] + ++ lib.optionals withSharedLLVM [ + # Upstream statically links libllvm and libclang++, resulting in a ~5x increase in binary size. + ./2-shared-llvm.patch + ] + ++ lib.optionals withGlslang [ + # Upstream depends on glslang 13 and there are minor breaking changes in glslang 15, the version + # we ship in nixpkgs. + ./3-glslang-15.patch + ]; + + outputs = [ + "out" + "dev" + "doc" + ]; + + strictDeps = true; + + nativeBuildInputs = [ + cmake + ninja + python3 + ]; + + buildInputs = + [ + miniz + lz4 + libxml2 + spirv-headers + ] + ++ (lib.optionals stdenv.hostPlatform.isLinux [ + libX11 + ]) + ++ (lib.optionals withLLVM [ + # Slang only supports LLVM 13: + # https://github.com/shader-slang/slang/blob/master/docs/building.md#llvm-support + llvmPackages_13.llvm + llvmPackages_13.libclang + ]) + ++ (lib.optionals withGlslang [ + # SPIRV-tools is included in glslang. + glslang + ]); + + separateDebugInfo = true; + + # Required for spaces in cmakeFlags, see https://github.com/NixOS/nixpkgs/issues/114044 + __structuredAttrs = true; + + preConfigure = + lib.optionalString stdenv.hostPlatform.isLinux '' + # required to handle LTO objects + export AR="${stdenv.cc.targetPrefix}gcc-ar" + export NM="${stdenv.cc.targetPrefix}gcc-nm" + export RANLIB="${stdenv.cc.targetPrefix}gcc-ranlib" + '' + + '' + # cmake setup hook only sets CMAKE_AR and CMAKE_RANLIB, but not these + prependToVar cmakeFlags "-DCMAKE_CXX_COMPILER_AR=$(command -v $AR)" + prependToVar cmakeFlags "-DCMAKE_CXX_COMPILER_RANLIB=$(command -v $RANLIB)" + ''; + + cmakeFlags = + [ + "-GNinja Multi-Config" + # The cmake setup hook only specifies `-DCMAKE_BUILD_TYPE=Release`, + # which does nothing for "Ninja Multi-Config". + "-DCMAKE_CONFIGURATION_TYPES=RelWithDebInfo" + # Handled by separateDebugInfo so we don't need special installation handling + "-DSLANG_ENABLE_SPLIT_DEBUG_INFO=OFF" + "-DSLANG_VERSION_FULL=v${finalAttrs.version}-nixpkgs" + # slang-rhi tries to download WebGPU dawn binaries, and as stated on + # https://github.com/shader-slang/slang-rhi is "under active refactoring + # and development, and is not yet ready for general use." + "-DSLANG_ENABLE_SLANG_RHI=OFF" + "-DSLANG_USE_SYSTEM_MINIZ=ON" + "-DSLANG_USE_SYSTEM_LZ4=ON" + "-DSLANG_SPIRV_HEADERS_INCLUDE_DIR=${spirv-headers}/include" + "-DSLANG_SLANG_LLVM_FLAVOR=${if withLLVM then "USE_SYSTEM_LLVM" else "DISABLE"}" + ] + # Currently depends on unreleased op type `SpvOpTypeNodePayloadArrayAMDX`, + # which will be included in next release >1.3.296 + ++ lib.optional (lib.versionAtLeast spirv-headers.version "1.3.297.0") "-DSLANG_USE_SYSTEM_SPIRV_HEADERS=ON" + ++ (lib.optionals withGlslang [ + "-DSLANG_USE_SYSTEM_SPIRV_TOOLS=ON" + "-DSLANG_USE_SYSTEM_GLSLANG=ON" + ]) + ++ lib.optional (!withGlslang) "-DSLANG_ENABLE_SLANG_GLSLANG=OFF"; + + nativeInstallCheckInputs = [ versionCheckHook ]; + versionCheckProgram = "${placeholder "out"}/bin/slangc"; + versionCheckProgramArg = [ "-v" ]; + doInstallCheck = true; + + passthru.updateScript = gitUpdater { + rev-prefix = "v"; + ignoredVersions = "*-draft"; + }; + + meta = { + description = "A shading language that makes it easier to build and maintain large shader codebases in a modular and extensible fashion"; + homepage = "https://github.com/shader-slang/slang"; + license = lib.licenses.asl20-llvm; + maintainers = with lib.maintainers; [ niklaskorz ]; + mainProgram = "slangc"; + platforms = lib.platforms.all; + }; +})