Skip to content

Commit 3b1586c

Browse files
committed
Docker build
1 parent 2f9b559 commit 3b1586c

11 files changed

Lines changed: 210 additions & 93 deletions

File tree

.gitattributes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
# Auto detect text files and perform LF normalization
22
* text=auto
3+
*.sh text eol=lf

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ results/*.txt
44
results/*.qdrep
55
results/*.nsys-rep
66
results/*.sqlite
7+
/.vs
8+
/out

CMakeLists.txt

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -6,34 +6,16 @@ set(CMAKE_CXX_STANDARD_REQUIRED ON)
66
set(CMAKE_CXX_EXTENSIONS OFF)
77

88
find_package(Vulkan REQUIRED)
9-
find_program(SLANGC slangc REQUIRED)
10-
11-
set(SHADER_DIR ${CMAKE_CURRENT_SOURCE_DIR}/shaders)
12-
set(SPIRV_DIR ${CMAKE_CURRENT_BINARY_DIR}/shaders)
13-
file(MAKE_DIRECTORY ${SPIRV_DIR})
14-
15-
set(SHADER_OUTPUTS
16-
${SPIRV_DIR}/triangle.vert.spv
17-
${SPIRV_DIR}/triangle.frag.spv
18-
)
19-
20-
add_custom_command(
21-
OUTPUT ${SPIRV_DIR}/triangle.vert.spv
22-
COMMAND ${SLANGC} -target spirv -profile glsl_460 -entry main -stage vertex ${SHADER_DIR}/triangle.vert.slang -o ${SPIRV_DIR}/triangle.vert.spv
23-
DEPENDS ${SHADER_DIR}/triangle.vert.slang
24-
)
25-
26-
add_custom_command(
27-
OUTPUT ${SPIRV_DIR}/triangle.frag.spv
28-
COMMAND ${SLANGC} -target spirv -profile glsl_460 -entry main -stage fragment ${SHADER_DIR}/triangle.frag.slang -o ${SPIRV_DIR}/triangle.frag.spv
29-
DEPENDS ${SHADER_DIR}/triangle.frag.slang
30-
)
31-
32-
add_custom_target(vk-bench-shaders DEPENDS ${SHADER_OUTPUTS})
9+
include(cmake/compile_shaders.cmake)
3310

11+
set(SHADER_DIR "${CMAKE_CURRENT_SOURCE_DIR}/shaders")
12+
set(SPIRV_DIR "${CMAKE_CURRENT_BINARY_DIR}/shaders")
13+
vk_compile_slang_shaders(SHADER_OUTPUTS vk-bench-shaders "${SHADER_DIR}" "${SPIRV_DIR}")
3414
add_executable(vk-bench src/main.cpp)
35-
add_dependencies(vk-bench vk-bench-shaders)
36-
target_include_directories(vk-bench PRIVATE include)
15+
target_include_directories(vk-bench PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/include")
3716
target_link_libraries(vk-bench PRIVATE Vulkan::Vulkan)
17+
18+
add_dependencies(vk-bench vk-bench-shaders)
19+
3820
install(TARGETS vk-bench RUNTIME DESTINATION bin)
39-
install(FILES ${SHADER_OUTPUTS} DESTINATION bin/shaders)
21+
install(FILES ${SHADER_OUTPUTS} DESTINATION bin/shaders)

CMakeSettings.json

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"configurations": [
3+
{
4+
"name": "x64-Debug",
5+
"generator": "Ninja",
6+
"configurationType": "Debug",
7+
"inheritEnvironments": [ "msvc_x64_x64" ],
8+
"buildRoot": "${projectDir}\\out\\build\\${name}",
9+
"installRoot": "${projectDir}\\out\\install\\${name}",
10+
"cmakeCommandArgs": "",
11+
"buildCommandArgs": "",
12+
"ctestCommandArgs": "",
13+
"debuggerCommandArguments": "--scene triangle --frames 300 --vsync 0"
14+
}
15+
]
16+
}

Dockerfile

Lines changed: 0 additions & 30 deletions
This file was deleted.

cmake/compile_shaders.cmake

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
# cmake/compile_shaders.cmake
2+
include_guard(GLOBAL)
3+
4+
# Allow override: -DSLANGC=/path/to/slangc
5+
set(SLANGC "" CACHE FILEPATH "Path to slangc executable")
6+
if (SLANGC STREQUAL "")
7+
find_program(SLANGC slangc)
8+
endif()
9+
10+
if (SLANGC STREQUAL "" OR NOT SLANGC)
11+
message(FATAL_ERROR
12+
"SLANGC is not set and slangc was not found in PATH. "
13+
"Set -DSLANGC=/path/to/slangc or ensure slangc is in PATH."
14+
)
15+
endif()
16+
17+
message(STATUS "SLANGC = ${SLANGC}")
18+
19+
function(vk_compile_slang_shaders OUT_SPV_LIST TARGET_NAME SHADER_DIR SPIRV_DIR)
20+
file(MAKE_DIRECTORY "${SPIRV_DIR}")
21+
22+
file(GLOB_RECURSE _SLANG_SHADERS
23+
CONFIGURE_DEPENDS
24+
"${SHADER_DIR}/*.slang"
25+
)
26+
27+
set(_OUTPUTS)
28+
29+
foreach(_SHADER IN LISTS _SLANG_SHADERS)
30+
file(RELATIVE_PATH _REL_PATH "${SHADER_DIR}" "${_SHADER}")
31+
string(REPLACE ".slang" ".spv" _SPV_REL_PATH "${_REL_PATH}")
32+
set(_OUTPUT_FILE "${SPIRV_DIR}/${_SPV_REL_PATH}")
33+
34+
get_filename_component(_OUTPUT_DIR "${_OUTPUT_FILE}" DIRECTORY)
35+
file(MAKE_DIRECTORY "${_OUTPUT_DIR}")
36+
37+
if (_SHADER MATCHES "\\.vert\\.slang$")
38+
set(_STAGE vertex)
39+
elseif (_SHADER MATCHES "\\.frag\\.slang$")
40+
set(_STAGE fragment)
41+
elseif (_SHADER MATCHES "\\.comp\\.slang$")
42+
set(_STAGE compute)
43+
else()
44+
message(FATAL_ERROR "Unknown shader stage for ${_SHADER} (expected .vert/.frag/.comp)")
45+
endif()
46+
47+
add_custom_command(
48+
OUTPUT "${_OUTPUT_FILE}"
49+
COMMAND "${SLANGC}"
50+
-target spirv
51+
-profile glsl_460
52+
-entry main
53+
-stage ${_STAGE}
54+
"${_SHADER}"
55+
-o "${_OUTPUT_FILE}"
56+
DEPENDS "${_SHADER}"
57+
COMMENT "slangc ${_REL_PATH} -> ${_SPV_REL_PATH}"
58+
VERBATIM
59+
)
60+
61+
list(APPEND _OUTPUTS "${_OUTPUT_FILE}")
62+
endforeach()
63+
64+
# Only create the target ONCE
65+
if (TARGET "${TARGET_NAME}")
66+
message(FATAL_ERROR "Target '${TARGET_NAME}' already exists. Choose a different name.")
67+
endif()
68+
69+
add_custom_target("${TARGET_NAME}" DEPENDS ${_OUTPUTS})
70+
71+
set("${OUT_SPV_LIST}" "${_OUTPUTS}" PARENT_SCOPE)
72+
endfunction()

docker/.dockerignore

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# build outputs
2+
out/
3+
build/
4+
cmake-build-*/
5+
CMakeFiles/
6+
CMakeCache.txt
7+
*.ninja
8+
.ninja_*
9+
compile_commands.json
10+
Testing/
11+
CTestTestfile.cmake
12+
13+
# git + editor stuff
14+
.git/
15+
.gitignore
16+
.vscode/
17+
.idea/
18+
19+
# OS junk
20+
.DS_Store
21+
Thumbs.db
22+
23+
# optional: large artifacts
24+
*.tar
25+
*.tar.gz
26+
results/

docker/Dockerfile

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,60 @@
1-
FROM nvidia/vulkan:1.3.280-ubuntu22.04
1+
FROM nvidia/cuda:13.1.1-cudnn-devel-ubuntu24.04
22

33
RUN apt-get update && apt-get install -y --no-install-recommends \
44
build-essential \
55
cmake \
66
pkg-config \
7-
vulkan-tools \
87
curl \
98
ca-certificates \
9+
libvulkan1 \
10+
libvulkan-dev \
11+
vulkan-tools \
12+
vulkan-validationlayers \
13+
mesa-vulkan-drivers \
14+
glslang-tools \
1015
&& rm -rf /var/lib/apt/lists/*
1116

12-
ARG SLANG_VERSION=2024.17.2
13-
RUN curl -fsSL -o /tmp/slang.tar.gz https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}-linux-x86_64.tar.gz \
14-
&& tar -xzf /tmp/slang.tar.gz -C /tmp \
15-
&& install -m 0755 /tmp/slang-${SLANG_VERSION}/bin/slangc /usr/local/bin/slangc \
16-
&& rm -rf /tmp/slang.tar.gz /tmp/slang-${SLANG_VERSION}
17-
17+
RUN apt-get update && apt-get install -y --no-install-recommends ninja-build \
18+
&& rm -rf /var/lib/apt/lists/*
1819
WORKDIR /workspace
19-
COPY CMakeLists.txt /workspace/CMakeLists.txt
20-
COPY src /workspace/src
21-
COPY include /workspace/include
22-
COPY shaders /workspace/shaders
23-
RUN cmake -S /workspace -B /workspace/build -DCMAKE_BUILD_TYPE=Release \
24-
&& cmake --build /workspace/build --config Release -j"$(nproc)" \
25-
&& install -m 0755 /workspace/build/vk-bench /usr/local/bin/vk-bench \
26-
&& install -d /usr/local/bin/shaders \
27-
&& cp /workspace/build/shaders/*.spv /usr/local/bin/shaders/
20+
COPY . .
21+
22+
# ---- Slang ----
23+
ARG SLANG_VERSION=2026.3.1
24+
RUN set -eux; \
25+
mkdir -p /opt/slang; \
26+
curl -fsSL -o /tmp/slang.tar.gz \
27+
"https://github.com/shader-slang/slang/releases/download/v${SLANG_VERSION}/slang-${SLANG_VERSION}-linux-x86_64.tar.gz"; \
28+
tar -xzf /tmp/slang.tar.gz -C /opt/slang; \
29+
rm -f /tmp/slang.tar.gz; \
30+
echo "== slang extract tree (top) =="; \
31+
find /opt/slang -maxdepth 3 -type d -print; \
32+
echo "== searching for slangc =="; \
33+
SLANGC_PATH="$(find /opt/slang -type f -name slangc -perm -111 | head -n 1)"; \
34+
test -n "$SLANGC_PATH"; \
35+
echo "Found slangc at: $SLANGC_PATH"; \
36+
install -m 0755 "$SLANGC_PATH" /usr/local/bin/slangc; \
37+
echo "== searching for libslang-compiler =="; \
38+
SLANG_LIB_DIR="$(dirname "$(find /opt/slang -type f -name 'libslang-compiler.so*' | head -n 1)")"; \
39+
test -n "$SLANG_LIB_DIR"; \
40+
echo "Using slang lib dir: $SLANG_LIB_DIR"; \
41+
echo "$SLANG_LIB_DIR" > /etc/ld.so.conf.d/slang.conf; \
42+
ldconfig; \
43+
slangc -version
44+
45+
46+
# Runtime shader dir for Docker entrypoint / app
47+
ENV VK_BENCH_SHADER_DIR=/workspace/build/shaders
48+
49+
# NVIDIA runtime hint: ensure Vulkan capability is exposed
50+
ENV NVIDIA_DRIVER_CAPABILITIES=all
51+
RUN which slangc && slangc -version
52+
# ---- Build ----
53+
RUN rm -rf build \
54+
&& cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release -DSLANGC=/usr/local/bin/slangc \
55+
&& cmake --build build -v --target vk-bench-shaders vk-bench \
56+
&& ls -lah build/shaders
2857

2958
COPY docker/entrypoint.sh /entrypoint.sh
30-
ENTRYPOINT ["/entrypoint.sh"]
59+
RUN chmod +x /entrypoint.sh
60+
ENTRYPOINT ["/entrypoint.sh"]

docker/entrypoint.sh

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
#!/usr/bin/env bash
22
set -euo pipefail
33

4-
if [[ "${1:-}" == "" ]]; then
5-
exec /usr/local/bin/vk-bench --headless --frames 300 --out /workspace/results.json
4+
cd /workspace/build
5+
6+
# if your code supports it, export shader dir explicitly
7+
export VK_BENCH_SHADER_DIR="${VK_BENCH_SHADER_DIR:-/workspace/build/shaders}"
8+
9+
if [[ $# -eq 0 ]]; then
10+
exec ./vk-bench --headless --frames 300 --vsync 0 --out /results/results.json
611
fi
712

8-
exec /usr/local/bin/vk-bench "$@"
13+
exec ./vk-bench "$@"

scripts/run_bench.sh

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,33 @@
22
set -euo pipefail
33

44
IMAGE="${VK_BENCH_IMAGE:-vk-bench}"
5-
RESULT_DIR="${1:-results}"
5+
6+
# Default results directory is repo-root/results (not scripts/results)
7+
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
8+
REPO_ROOT="$(cd -- "$SCRIPT_DIR/.." && pwd)"
9+
10+
RESULT_DIR="${1:-$REPO_ROOT/results}"
11+
612
mkdir -p "$RESULT_DIR"
713

8-
if ! command -v docker >/dev/null 2>&1; then
9-
echo "docker is required for scripts/run_bench.sh" >&2
10-
exit 1
11-
fi
14+
echo "Using image: $IMAGE"
15+
echo "Saving results to: $RESULT_DIR"
16+
docker --version
1217

13-
for scene in triangle million-tris compute-copy; do
18+
SCENES=(triangle million-tris compute-copy)
19+
20+
for scene in "${SCENES[@]}"; do
1421
echo "Running scene in Docker: $scene"
22+
1523
docker run --rm --gpus all \
16-
-v "$(pwd)/$RESULT_DIR:/results" \
24+
-v "$RESULT_DIR:/results" \
1725
"$IMAGE" \
18-
--headless --scene "$scene" --warmup 30 --frames 300 --vsync 0 --out "/results/${scene}.json"
26+
--headless \
27+
--scene "$scene" \
28+
--warmup 30 \
29+
--frames 300 \
30+
--vsync 0 \
31+
--out "/results/${scene}.json"
1932
done
2033

21-
echo "Saved benchmark outputs to $RESULT_DIR"
34+
echo "Saved benchmark outputs to $RESULT_DIR"

0 commit comments

Comments
 (0)