summaryrefslogtreecommitdiff
path: root/contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
diff options
context:
space:
mode:
author3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
committer3gg <3gg@shellblade.net>2025-12-27 12:03:39 -0800
commit5a079a2d114f96d4847d1ee305d5b7c16eeec50e (patch)
tree8926ab44f168acf787d8e19608857b3af0f82758 /contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
Initial commit
Diffstat (limited to 'contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh')
-rwxr-xr-xcontrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh106
1 files changed, 106 insertions, 0 deletions
diff --git a/contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh b/contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
new file mode 100755
index 0000000..9b019e5
--- /dev/null
+++ b/contrib/SDL-3.2.8/src/render/gpu/shaders/build-shaders.sh
@@ -0,0 +1,106 @@
1#!/usr/bin/env bash
2
3set -e
4
5# NOTE: fxc is tested on Linux with https://github.com/mozilla/fxc2
6
7which fxc &>/dev/null && HAVE_FXC=1 || HAVE_FXC=0
8which dxc &>/dev/null && HAVE_DXC=1 || HAVE_DXC=0
9which spirv-cross &>/dev/null && HAVE_SPIRV_CROSS=1 || HAVE_SPIRV_CROSS=0
10
11[ "$HAVE_FXC" != 0 ] || echo "fxc not in PATH; D3D11 shaders will not be rebuilt"
12[ "$HAVE_DXC" != 0 ] || echo "dxc not in PATH; D3D12 shaders will not be rebuilt"
13[ "$HAVE_SPIRV_CROSS" != 0 ] || echo "spirv-cross not in PATH; D3D11, D3D12, Metal shaders will not be rebuilt"
14
15USE_FXC=${USE_FXC:-$HAVE_FXC}
16USE_DXC=${USE_DXC:-$HAVE_DXC}
17USE_SPIRV_CROSS=${USE_SPIRV_CROSS:-$HAVE_SPIRV_CROSS}
18
19spirv_bundle="spir-v.h"
20dxbc50_bundle="dxbc50.h"
21dxil60_bundle="dxil60.h"
22metal_bundle="metal.h"
23
24rm -f "$spirv_bundle"
25[ "$USE_SPIRV_CROSS" != 0 ] && rm -f "$metal_bundle"
26[ "$USE_SPIRV_CROSS" != 0 ] && [ "$USE_FXC" != 0 ] && rm -f "$dxbc50_bundle"
27[ "$USE_SPIRV_CROSS" != 0 ] && [ "$USE_DXC" != 0 ] && rm -f "$dxil60_bundle"
28
29make-header() {
30 xxd -i "$1" | sed \
31 -e 's/^unsigned /const unsigned /g' \
32 -e 's,^const,static const,' \
33 > "$1.h"
34}
35
36compile-hlsl-dxbc() {
37 local src="$1"
38 local profile="$2"
39 local output_basename="$3"
40 local var_name="$(echo "$output_basename" | sed -e 's/\./_/g')"
41
42 fxc "$src" /E main /T $2 /Fh "$output_basename.tmp.h" || exit $?
43 sed \
44 -e "s/g_main/$var_name/;s/\r//g" \
45 -e 's,^const,static const,' \
46 -e 's,const unsigned,const signed,' \
47 < "$output_basename.tmp.h" \
48 > "$output_basename.h"
49 rm -f "$output_basename.tmp.h"
50}
51
52compile-hlsl-dxil() {
53 local src="$1"
54 local profile="$2"
55 local output_basename="$3"
56 local var_name="$(echo "$output_basename" | sed -e 's/\./_/g')"
57
58 dxc "$src" -E main -T $2 -Fh "$output_basename.tmp.h" -O3 || exit $?
59 sed \
60 -e "s/g_main/$var_name/;s/\r//g" \
61 -e 's,^const,static const,' \
62 < "$output_basename.tmp.h" \
63 > "$output_basename.h"
64 rm -f "$output_basename.tmp.h"
65}
66
67for i in *.vert *.frag; do
68 spv="$i.spv"
69 metal="$i.metal"
70 hlsl50="$i.sm50.hlsl"
71 dxbc50="$i.sm50.dxbc"
72 hlsl60="$i.sm60.hlsl"
73 dxil60="$i.sm60.dxil"
74
75 glslangValidator -g0 -Os "$i" -V -o "$spv" --quiet
76
77 make-header "$spv"
78 echo "#include \"$spv.h\"" >> "$spirv_bundle"
79
80 if [ "$USE_SPIRV_CROSS" = "0" ]; then
81 continue
82 fi
83
84 spirv-cross "$spv" --hlsl --shader-model 50 --hlsl-enable-compat --output "$hlsl50"
85 spirv-cross "$spv" --hlsl --shader-model 60 --hlsl-enable-compat --output "$hlsl60"
86
87 if [ "${i##*.}" == "frag" ]; then
88 hlsl_stage="ps"
89 else
90 hlsl_stage="vs"
91 fi
92
93 if [ "$USE_FXC" != "0" ]; then
94 compile-hlsl-dxbc "$hlsl50" ${hlsl_stage}_5_0 "$dxbc50"
95 echo "#include \"$dxbc50.h\"" >> "$dxbc50_bundle"
96 fi
97
98 if [ "$USE_DXC" != "0" ]; then
99 compile-hlsl-dxil "$hlsl60" ${hlsl_stage}_6_0 "$dxil60"
100 echo "#include \"$dxil60.h\"" >> "$dxil60_bundle"
101 fi
102
103 spirv-cross "$spv" --msl --output "$metal"
104 make-header "$metal"
105 echo "#include \"$metal.h\"" >> "$metal_bundle"
106done