Files
mirage_slang/main.py
2025-06-11 14:32:56 +08:00

72 lines
2.3 KiB
Python

#!/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', 'dxbc', '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)
# if global_vars.target == TargetFormat.DXIL:
# global_vars.target = TargetFormat.DXBC
# print("Warning: DXIL target is not supported, using DXBC instead.")
# 仅保留路径部分
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()