From 29ba5a83d735066c64b0b4c68eb620fa30635524 Mon Sep 17 00:00:00 2001 From: Mason M Date: Tue, 25 Jun 2024 11:40:59 -0300 Subject: [PATCH] Split generated shader file into separate translation unit --- ggml_vk_generate_shaders.py | 41 ++++++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/ggml_vk_generate_shaders.py b/ggml_vk_generate_shaders.py index 38914eedb..ecd11f25d 100644 --- a/ggml_vk_generate_shaders.py +++ b/ggml_vk_generate_shaders.py @@ -5,6 +5,7 @@ import argparse import asyncio import os from tempfile import gettempdir +import sys logger = logging.getLogger("ggml-vk-generate-shaders") @@ -27,9 +28,6 @@ type_names = [ ASYNCIO_CONCURRENCY = 64 -input_dir = "vulkan-shaders" -output_dir = gettempdir() - lock = asyncio.Lock() shader_fnames = [] @@ -184,30 +182,37 @@ async def main(): sem = asyncio.Semaphore(ASYNCIO_CONCURRENCY) await asyncio.gather(*(withSemaphore(sem, task) for task in tasks)) - with open("ggml-vulkan-shaders.hpp", "w") as f: - f.write("#include \n\n") + with open(target_hpp, "w") as hdr, open(target_cpp, "w") as src: + hdr.write("#include \n\n") + src.write(f"#include \"{os.path.basename(target_hpp)}\"\n\n") for name, path in sorted(shader_fnames): - with open(path, "rb") as spv: counter = 0 newline_counter = 0 - f.write(f"unsigned char {name}_data[] = {{\n") + data = "" for val in spv.read(): - f.write(f"0x{val:02x},") + data += f"0x{val:02x}," newline_counter += 1 counter += 1 if newline_counter >= 12: newline_counter = 0 - f.write("\n") - f.write("\n};\n") - f.write(f"const uint64_t {name}_len = {counter};\n\n") - os.remove(path) + data += "\n" + hdr.write(f"extern unsigned char {name}_data[{counter}];\n") + hdr.write(f"const uint64_t {name}_len = {counter};\n\n") + src.write(f"unsigned char {name}_data[{counter}] = {{\n{data}\n}};\n\n") + if not no_clean: + os.remove(path) if __name__ == "__main__": parser = argparse.ArgumentParser(description="GGML Vulkan Shader Generator") parser.add_argument("--glslc", help="Path to glslc") + parser.add_argument("--input-dir", default="vulkan-shaders", help="Directory containing shader sources") + parser.add_argument("--output-dir", default=gettempdir(), help="Directory for containing SPIR-V output") + parser.add_argument("--target-hpp", default="ggml-vulkan-shaders.hpp", help="Path to generated header file") + parser.add_argument("--target-cpp", default="ggml-vulkan-shaders.cpp", help="Path to generated cpp file") + parser.add_argument("--no-clean", action="store_true", help="Keep temporary SPIR-V files in output-dir after build") parser.add_argument("--verbose", action="store_true", help="increase output verbosity") args = parser.parse_args() @@ -217,4 +222,16 @@ if __name__ == "__main__": if args.glslc: GLSLC = args.glslc + input_dir = args.input_dir + if not os.path.isdir(input_dir): + sys.exit(f"\"{input_dir}\" must be a valid directory containing shader sources") + + output_dir = args.output_dir + if not os.path.isdir(output_dir): + os.makedirs(output_dir) + + target_hpp = args.target_hpp + target_cpp = args.target_cpp + no_clean = args.no_clean + asyncio.run(main())