From ca34a022a52f86d0e46a1cae50d05ecf8be611d4 Mon Sep 17 00:00:00 2001 From: Triang3l Date: Sun, 4 Jan 2026 16:53:52 +0300 Subject: [PATCH] [Build] Replace spirv-remap with spirv-opt --canonicalize-ids `spirv-remap` is not present in modern Vulkan SDK versions, it was replaced with the `--canonicalize-ids` pass in `spirv-opt`. Overall, canonicalization provides a significant compression improvement, which is important considering that currently Xenia is distributed in a ZIP archive and contains many very similar shaders. With normal DEFLATE compression, canonicalization reduced the size of a ZIP with `xenia.exe` from 3.54 MB to 3.45 MB in a test done before committing. Also disable stripping of debug information from shaders, which apparently was among what `spirv-remap` was doing with `--do-everything`, as binding and uniform buffer member names heavily aid in debugging in RenderDoc. Partially integrated from #2329. Co-authored-by: Herman S. <429230+has207@users.noreply.github.com> Co-authored-by: Gliniak --- xenia-build | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/xenia-build b/xenia-build index a5cf5e193..d8c2be563 100755 --- a/xenia-build +++ b/xenia-build @@ -1016,10 +1016,6 @@ class BuildShadersCommand(Command): if not has_bin(spirv_opt): print('ERROR: could not find spirv-opt') return 1 - spirv_remap = os.path.join(vulkan_bin_path, 'spirv-remap') - if not has_bin(spirv_remap): - print('ERROR: could not find spirv-remap') - return 1 spirv_dis = os.path.join(vulkan_bin_path, 'spirv-dis') if not has_bin(spirv_dis): print('ERROR: could not find spirv-dis') @@ -1079,27 +1075,24 @@ class BuildShadersCommand(Command): universal_newlines = True).returncode != 0: print('ERROR: failed to build a SPIR-V shader') return 1 + # Optimize the shader, and then improve the compression quality + # for the application executable via ID canonicalization by + # making IDs in similar shaders more likely to be the same. + # Don't strip debug information such as binding and buffer + # structure member names, however, as it's useful for + # investigating issues in debuggers such as RenderDoc. # spirv-opt input and output files must be different. spirv_file_path = spirv_file_path_base + '.spv' if subprocess.call([ spirv_opt, '-O', + '--canonicalize-ids', spirv_glslang_file_path, '-o', spirv_file_path, ]) != 0: print('ERROR: failed to optimize a SPIR-V shader') return 1 os.remove(spirv_glslang_file_path) - # spirv-remap takes the output directory, but it may be the same - # as the one the input is stored in. - if subprocess.call([ - spirv_remap, - '--do-everything', - '-i', spirv_file_path, - '-o', spirv_dir_path, - ]) != 0: - print('ERROR: failed to remap a SPIR-V shader') - return 1 spirv_dis_file_path = spirv_file_path_base + '.txt'; if subprocess.call([ spirv_dis,