Skip to content

Commit

Permalink
render_gpu: Switch D3D12 shaders to DXIL
Browse files Browse the repository at this point in the history
  • Loading branch information
Akaricchi committed Aug 19, 2024
1 parent 5fc2aae commit 1df95f3
Show file tree
Hide file tree
Showing 16 changed files with 2,895 additions and 941 deletions.
25 changes: 13 additions & 12 deletions src/render/sdlgpu/SDL_shaders_gpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ typedef struct GPU_ShaderModuleSource

#if SDL_GPU_D3D12
#define IF_D3D12(...) __VA_ARGS__
#include "shaders/dxbc51.h"
#include "shaders/dxil60.h"
#else
#define IF_D3D12(...)
#endif
Expand All @@ -83,7 +83,7 @@ typedef struct GPU_ShaderSources
{
IF_VULKAN(GPU_ShaderModuleSource spirv;)
IF_D3D11(GPU_ShaderModuleSource dxbc50;)
IF_D3D12(GPU_ShaderModuleSource dxbc51;)
IF_D3D12(GPU_ShaderModuleSource dxil60;)
IF_METAL(GPU_ShaderModuleSource msl;)
unsigned int num_samplers;
unsigned int num_uniform_buffers;
Expand All @@ -95,8 +95,8 @@ typedef struct GPU_ShaderSources
#define SHADER_DXBC50(code) \
IF_D3D11(.dxbc50 = { code, sizeof(code), SDL_GPU_SHADERFORMAT_DXBC }, )

#define SHADER_DXBC51(code) \
IF_D3D12(.dxbc51 = { code, sizeof(code), SDL_GPU_SHADERFORMAT_DXBC }, )
#define SHADER_DXIL60(code) \
IF_D3D12(.dxil60 = { code, sizeof(code), SDL_GPU_SHADERFORMAT_DXIL }, )

#define SHADER_METAL(code) \
IF_METAL(.msl = { code, sizeof(code), SDL_GPU_SHADERFORMAT_MSL }, )
Expand All @@ -108,23 +108,23 @@ static const GPU_ShaderSources vert_shader_sources[NUM_VERT_SHADERS] = {
.num_uniform_buffers = 1,
SHADER_SPIRV(linepoint_vert_spv)
SHADER_DXBC50(linepoint_vert_sm50_dxbc)
SHADER_DXBC51(linepoint_vert_sm51_dxbc)
SHADER_DXIL60(linepoint_vert_sm60_dxil)
SHADER_METAL(linepoint_vert_metal)
},
[VERT_SHADER_TRI_COLOR] = {
.num_samplers = 0,
.num_uniform_buffers = 1,
SHADER_SPIRV(tri_color_vert_spv)
SHADER_DXBC50(tri_color_vert_sm50_dxbc)
SHADER_DXBC51(tri_color_vert_sm51_dxbc)
SHADER_DXIL60(tri_color_vert_sm60_dxil)
SHADER_METAL(tri_color_vert_metal)
},
[VERT_SHADER_TRI_TEXTURE] = {
.num_samplers = 0,
.num_uniform_buffers = 1,
SHADER_SPIRV(tri_texture_vert_spv)
SHADER_DXBC50(tri_texture_vert_sm50_dxbc)
SHADER_DXBC51(tri_texture_vert_sm51_dxbc)
SHADER_DXIL60(tri_texture_vert_sm60_dxil)
SHADER_METAL(tri_texture_vert_metal)
},
};
Expand All @@ -135,23 +135,23 @@ static const GPU_ShaderSources frag_shader_sources[NUM_FRAG_SHADERS] = {
.num_uniform_buffers = 0,
SHADER_SPIRV(color_frag_spv)
SHADER_DXBC50(color_frag_sm50_dxbc)
SHADER_DXBC51(color_frag_sm51_dxbc)
SHADER_DXIL60(color_frag_sm60_dxil)
SHADER_METAL(color_frag_metal)
},
[FRAG_SHADER_TEXTURE_RGB] = {
.num_samplers = 1,
.num_uniform_buffers = 0,
SHADER_SPIRV(texture_rgb_frag_spv)
SHADER_DXBC50(texture_rgb_frag_sm50_dxbc)
SHADER_DXBC51(texture_rgb_frag_sm51_dxbc)
SHADER_DXIL60(texture_rgb_frag_sm60_dxil)
SHADER_METAL(texture_rgb_frag_metal)
},
[FRAG_SHADER_TEXTURE_RGBA] = {
.num_samplers = 1,
.num_uniform_buffers = 0,
SHADER_SPIRV(texture_rgba_frag_spv)
SHADER_DXBC50(texture_rgba_frag_sm50_dxbc)
SHADER_DXBC51(texture_rgba_frag_sm51_dxbc)
SHADER_DXIL60(texture_rgba_frag_sm60_dxil)
SHADER_METAL(texture_rgb_frag_metal)
},
};
Expand All @@ -166,7 +166,7 @@ static SDL_GpuShader *CompileShader(const GPU_ShaderSources *sources, SDL_GpuDev
/* clang-format off */
IF_VULKAN( case SDL_GPU_DRIVER_VULKAN: sms = &sources->spirv; break;)
IF_D3D11( case SDL_GPU_DRIVER_D3D11: sms = &sources->dxbc50; break;)
IF_D3D12( case SDL_GPU_DRIVER_D3D12: sms = &sources->dxbc51; break;)
IF_D3D12( case SDL_GPU_DRIVER_D3D12: sms = &sources->dxil60; break;)
IF_METAL( case SDL_GPU_DRIVER_METAL: sms = &sources->msl; break;)
/* clang-format on */

Expand Down Expand Up @@ -243,7 +243,8 @@ SDL_GpuShader *GPU_GetFragmentShader(GPU_Shaders *shaders, GPU_FragmentShaderID
void GPU_FillSupportedShaderFormats(SDL_PropertiesID props)
{
SDL_SetBooleanProperty(props, SDL_PROP_GPU_CREATEDEVICE_SHADERS_SPIRV_BOOL, SDL_GPU_VULKAN);
SDL_SetBooleanProperty(props, SDL_PROP_GPU_CREATEDEVICE_SHADERS_DXBC_BOOL, SDL_GPU_D3D11 || SDL_GPU_D3D12);
SDL_SetBooleanProperty(props, SDL_PROP_GPU_CREATEDEVICE_SHADERS_DXBC_BOOL, SDL_GPU_D3D11);
SDL_SetBooleanProperty(props, SDL_PROP_GPU_CREATEDEVICE_SHADERS_DXIL_BOOL, SDL_GPU_D3D12);
SDL_SetBooleanProperty(props, SDL_PROP_GPU_CREATEDEVICE_SHADERS_MSL_BOOL, SDL_GPU_METAL);
}

Expand Down
55 changes: 35 additions & 20 deletions src/render/sdlgpu/shaders/build-shaders.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,26 +5,29 @@ set -e
# NOTE: fxc is tested on Linux with https://github.com/mozilla/fxc2

which fxc &>/dev/null && HAVE_FXC=1 || HAVE_FXC=0
which dxc &>/dev/null && HAVE_DXC=1 || HAVE_DXC=0

[ "$HAVE_FXC" != 0 ] || echo "fxc not in PATH; D3D11 shaders will not be rebuilt"
[ "$HAVE_DXC" != 0 ] || echo "dxc not in PATH; D3D12 shaders will not be rebuilt"

USE_FXC=${USE_FXC:-HAVE_FXC}
USE_DXC=${USE_DXC:-HAVE_DXC}

spirv_bundle="spir-v.h"
dxbc50_bundle="dxbc50.h"
dxbc51_bundle="dxbc51.h"
dxil60_bundle="dxil60.h"
metal_bundle="metal.h"

rm -f "$spirv_bundle"
rm -f "$metal_bundle"

if [ "$USE_FXC" != 0 ]; then
rm -f "$dxbc50_bundle"
rm -f "$dxbc51_bundle"
fi
[ "$USE_FXC" != 0 ] && rm -f "$dxbc50_bundle"
[ "$USE_DXC" != 0 ] && rm -f "$dxil60_bundle"

make-header() {
xxd -i "$1" | sed -e 's/^unsigned /const unsigned /g' > "$1.h"
}

compile-hlsl() {
compile-hlsl-dxbc() {
local src="$1"
local profile="$2"
local output_basename="$3"
Expand All @@ -34,34 +37,46 @@ compile-hlsl() {
sed -i "s/g_main/$var_name/;s/\r//g" "$output_basename.h"
}

compile-hlsl-dxil() {
local src="$1"
local profile="$2"
local output_basename="$3"
local var_name="$(echo "$output_basename" | sed -e 's/\./_/g')"

dxc "$src" -E main -T $2 -Fh "$output_basename.h" -O3 || exit $?
sed -i "s/g_main/$var_name/;s/\r//g" "$output_basename.h"
}

for i in *.vert *.frag; do
spv="$i.spv"
metal="$i.metal"
hlsl50="$i.sm50.hlsl"
dxbc50="$i.sm50.dxbc"
hlsl51="$i.sm51.hlsl"
dxbc51="$i.sm51.dxbc"
hlsl60="$i.sm60.hlsl"
dxil60="$i.sm60.dxil"

glslangValidator -g0 -Os "$i" -V -o "$spv" --quiet

make-header "$spv"
echo "#include \"$spv.h\"" >> "$spirv_bundle"

spirv-cross "$spv" --hlsl --shader-model 50 --hlsl-enable-compat --output "$hlsl50"
spirv-cross "$spv" --hlsl --shader-model 51 --hlsl-enable-compat --output "$hlsl51"

if [ "$USE_FXC" != "0" ]; then
if [ "${i##*.}" == "frag" ]; then
stage="ps"
else
stage="vs"
fi
spirv-cross "$spv" --hlsl --shader-model 60 --hlsl-enable-compat --output "$hlsl60"

compile-hlsl "$hlsl50" ${stage}_5_0 "$dxbc50"
compile-hlsl "$hlsl51" ${stage}_5_1 "$dxbc51"
if [ "${i##*.}" == "frag" ]; then
hlsl_stage="ps"
else
hlsl_stage="vs"
fi

if [ "$USE_FXC" != "0" ]; then
compile-hlsl-dxbc "$hlsl50" ${hlsl_stage}_5_0 "$dxbc50"
echo "#include \"$dxbc50.h\"" >> "$dxbc50_bundle"
echo "#include \"$dxbc51.h\"" >> "$dxbc51_bundle"
fi

if [ "$USE_DXC" != "0" ]; then
compile-hlsl-dxil "$hlsl60" ${hlsl_stage}_6_0 "$dxil60"
echo "#include \"$dxil60.h\"" >> "$dxil60_bundle"
fi

spirv-cross "$spv" --msl --output "$metal"
Expand Down
85 changes: 0 additions & 85 deletions src/render/sdlgpu/shaders/color.frag.sm51.dxbc.h

This file was deleted.

Loading

0 comments on commit 1df95f3

Please sign in to comment.