72 lines
2.3 KiB
Python
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() |