78 lines
2.8 KiB
Python
78 lines
2.8 KiB
Python
# Copyright 2020 Google LLC
|
|
# Copyright 2023 Sascha Willems
|
|
|
|
import argparse
|
|
import fileinput
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
parser = argparse.ArgumentParser(description='Compile all .hlsl shaders')
|
|
parser.add_argument('--dxc', type=str, help='path to DXC executable')
|
|
args = parser.parse_args()
|
|
|
|
def findDXC():
|
|
def isExe(path):
|
|
return os.path.isfile(path) and os.access(path, os.X_OK)
|
|
|
|
if args.dxc != None and isExe(args.dxc):
|
|
return args.dxc
|
|
|
|
exe_name = "dxc"
|
|
if os.name == "nt":
|
|
exe_name += ".exe"
|
|
|
|
for exe_dir in os.environ["PATH"].split(os.pathsep):
|
|
full_path = os.path.join(exe_dir, exe_name)
|
|
if isExe(full_path):
|
|
return full_path
|
|
|
|
sys.exit("Could not find DXC executable on PATH, and was not specified with --dxc")
|
|
|
|
dxc_path = findDXC()
|
|
dir_path = os.path.dirname(os.path.realpath(__file__))
|
|
dir_path = dir_path.replace('\\', '/')
|
|
for root, dirs, files in os.walk(dir_path):
|
|
for file in files:
|
|
if file.endswith(".vert") or file.endswith(".frag") or file.endswith(".comp") or file.endswith(".geom") or file.endswith(".tesc") or file.endswith(".tese") or file.endswith(".rgen") or file.endswith(".rchit") or file.endswith(".rmiss") or file.endswith(".mesh") :
|
|
hlsl_file = os.path.join(root, file)
|
|
spv_out = hlsl_file + ".spv"
|
|
|
|
target = ''
|
|
profile = ''
|
|
if(hlsl_file.find('.vert') != -1):
|
|
profile = 'vs_6_1'
|
|
elif(hlsl_file.find('.frag') != -1):
|
|
profile = 'ps_6_4'
|
|
elif(hlsl_file.find('.comp') != -1):
|
|
profile = 'cs_6_1'
|
|
elif(hlsl_file.find('.geom') != -1):
|
|
profile = 'gs_6_1'
|
|
elif(hlsl_file.find('.tesc') != -1):
|
|
profile = 'hs_6_1'
|
|
elif(hlsl_file.find('.tese') != -1):
|
|
profile = 'ds_6_1'
|
|
elif(hlsl_file.find('.rgen') != -1 or
|
|
hlsl_file.find('.rchit') != -1 or
|
|
hlsl_file.find('.rmiss') != -1):
|
|
target='-fspv-target-env=vulkan1.2'
|
|
profile = 'lib_6_3'
|
|
elif(hlsl_file.find('.mesh') != -1):
|
|
target='-fspv-target-env=vulkan1.2'
|
|
profile = 'ms_6_6'
|
|
|
|
print('Compiling %s' % (hlsl_file))
|
|
subprocess.check_output([
|
|
dxc_path,
|
|
'-spirv',
|
|
'-T', profile,
|
|
'-E', 'main',
|
|
'-fspv-extension=SPV_KHR_ray_tracing',
|
|
'-fspv-extension=SPV_KHR_multiview',
|
|
'-fspv-extension=SPV_KHR_shader_draw_parameters',
|
|
'-fspv-extension=SPV_EXT_descriptor_indexing',
|
|
'-fspv-extension=SPV_KHR_ray_query',
|
|
'-fspv-extension=SPV_KHR_fragment_shading_rate',
|
|
target,
|
|
hlsl_file,
|
|
'-Fo', spv_out])
|