Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

shader-slang: init at 2025.2 #358202

Merged
merged 1 commit into from
Jan 11, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 77 additions & 0 deletions pkgs/by-name/sh/shader-slang/1-find-packages.patch
Original file line number Diff line number Diff line change
@@ -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)
27 changes: 27 additions & 0 deletions pkgs/by-name/sh/shader-slang/2-shared-llvm.patch
Original file line number Diff line number Diff line change
@@ -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
45 changes: 45 additions & 0 deletions pkgs/by-name/sh/shader-slang/3-glslang-15.patch
Original file line number Diff line number Diff line change
@@ -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 <memory>
#include <mutex>
#include <sstream>
+#include <cassert>

// 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<unsigned int> spirv;
spv::SpvBuildLogger logger;
158 changes: 158 additions & 0 deletions pkgs/by-name/sh/shader-slang/package.nix
Original file line number Diff line number Diff line change
@@ -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;
};
})