xemu/subprojects/SPIRV-Reflect/tests/build_all_shaders.py

74 lines
3.3 KiB
Python

# Usage:
# python tests/build_all_shaders.py
import argparse
import os
import pathlib
import shutil
import subprocess
import sys
def my_which(cmd):
if sys.hexversion >= 0x03030000:
return shutil.which(cmd)
else:
try:
subprocess.check_output([cmd], stderr=subprocess.STDOUT)
return cmd
except subprocess.CalledProcessError:
return cmd # that's fine, it exists though
except OSError:
return None
shaders = [
{'source':"glsl/built_in_format.glsl", 'entry':"main", 'stage':'vert'},
{'source':"glsl/buffer_pointer.glsl", 'entry':"main", 'stage':'frag', 'target-env':'vulkan1.3'},
{'source':"glsl/input_attachment.glsl", 'entry':"main", 'stage':'frag'},
{'source':"glsl/texel_buffer.glsl", 'entry':"main", 'stage':'vert'},
{'source':"glsl/storage_buffer.glsl", 'entry':"main", 'stage':'comp', 'target-env':'vulkan1.1'},
{'source':"glsl/runtime_array_of_array_of_struct.glsl", 'entry':"main", 'stage':'comp'},
{'source':"hlsl/append_consume.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
{'source':"hlsl/binding_array.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
{'source':"hlsl/binding_types.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
{'source':"hlsl/cbuffer.hlsl", 'entry':"main", 'profile':'vs_6_0', 'stage':'vert'},
{'source':"hlsl/counter_buffers.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
{'source':"hlsl/semantics.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
{'source':"hlsl/user_type.hlsl", 'entry':"main", 'profile':'ps_6_0', 'stage':'frag'},
]
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Compile test shaders")
parser.add_argument("--glslc", help="path to glslc compiler", default=my_which("glslc"))
parser.add_argument("--dxc", help="path to dxc compiler", default=my_which("dxc"))
parser.add_argument("--verbose", "-v", help="enable verbose output", action='store_true')
args = parser.parse_args()
test_dir = pathlib.Path(__file__).parent.resolve()
root_dir = test_dir.parent.resolve()
if not args.dxc:
print("WARNING: dxc not found in PATH; HLSL shaders will be compiled with glslc.")
if not args.glslc:
print("WARNING: glslc not found in PATH. This is a bad sign.")
for shader in shaders:
src_path = os.path.join(test_dir, shader['source'])
base, ext = os.path.splitext(src_path)
spv_path = base + ".spv"
if ext.lower() == ".glsl" or (ext.lower() == ".hlsl" and not args.dxc):
compile_cmd_args = [args.glslc, "-g", "-fshader-stage=" + shader['stage'], "-fentry-point=" + shader['entry'], "-o", spv_path, src_path]
if 'target-env' in shader:
compile_cmd_args.append("--target-env=" + shader['target-env'])
elif ext.lower() == ".hlsl":
compile_cmd_args = [args.dxc, "-spirv", "-Zi", "-fspv-reflect", "-O0", "-T", shader['profile'], "-E", shader['entry'], "-Fo", spv_path, src_path]
print("%s -> %s" % (src_path, spv_path))
if args.verbose:
print(" ".join(compile_cmd_args))
try:
compile_cmd_output = subprocess.check_output(compile_cmd_args, stderr = subprocess.STDOUT)
except subprocess.CalledProcessError as error:
print("Compilation failed for %s with error code %d:\n%s" % (src_path, error.returncode, error.output.decode('utf-8')))
print("")