#!/usr/bin/env python3 """ SDL3_GPU Slang Compiler - Command Line Interface 命令行接口 """ import argparse import os from compiler import SDL3GPUSlangCompiler from shader_types import TargetFormat from global_vars import * def main(): parser = argparse.ArgumentParser(description='SDL3 GPU Slang Compiler') parser.add_argument('input', help='Input Slang shader file') parser.add_argument('-t', '--target', choices=['spirv', 'dxil', 'msl'], required=True, help='Target shader format') parser.add_argument('-o', '--output-dir', required=True, help='Output path for binding code') parser.add_argument('-i', '--include-dir', help='Include path for slang shader') args = parser.parse_args() # 获取编译文件的绝对路径 input_path = os.path.abspath(args.input) global_vars.source_file = input_path global_vars.source_file_name = os.path.splitext(os.path.basename(input_path))[0] global_vars.source_path = os.path.dirname(input_path) global_vars.output_dir = os.path.abspath(args.output_dir) global_vars.target = TargetFormat(args.target) # 仅保留路径部分 include_dirs = [ global_vars.source_path, ] if args.include_dir: include_dirs.append(args.include_dir) global_vars.include_dirs = include_dirs # 创建编译器实例 compiler = SDL3GPUSlangCompiler() # 解析着色器 print(f"**Parsing** {args.input}...") shaders = compiler.parse_slang_shader() # 编译每个入口点 binding_infos = [] for name, shader_info in shaders.items(): print(f"**Compiling** {name}...") binding_info = compiler.compile_shader(shader_info, global_vars.target) binding_infos.append(binding_info) binding_output_file_pathname = os.path.abspath(args.output_dir) binding_output_file_pathname = os.path.join(binding_output_file_pathname, f"{global_vars.source_file_name}.shader.h") # 生成绑定代码 print(f"\n**Generating** binding code to {binding_output_file_pathname}...") compiler.generate_binding_functions(binding_infos, binding_output_file_pathname) print("**Done!**") if __name__ == '__main__': main()