diff --git a/.travis.yml b/.travis.yml index becc7cb5f..a1f922bf7 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,17 +1,52 @@ -language: cpp -os: - - linux - - osx -osx_image: xcode10 +language: + - cpp + - python -# Use Ubuntu 14.04 LTS (Trusty) as the Linux testing environment. -sudo: required -dist: trusty +python: 3.7 + +matrix: + include: + - os: linux + dist: trusty + compiler: gcc + env: + - GENERATOR="Unix Makefiles" + - os: linux + dist: trusty + compiler: clang + env: + - GENERATOR="Unix Makefiles" + - os: osx + compiler: clang + osx_image: xcode10 + env: + - GENERATOR="Unix Makefiles" + - os: windows + before_install: + - choco install python3 + - choco install python2 + - export PATH="/c/Python27:/c/Python27/Scripts:$PATH" + - export PATH="/c/Python37:/c/Python37/Scripts:$PATH" + env: + - GENERATOR="Visual Studio 15 2017" + - os: windows + before_install: + - choco install python3 + - choco install python2 + - export PATH="/c/Python27:/c/Python27/Scripts:$PATH" + - export PATH="/c/Python37:/c/Python37/Scripts:$PATH" + env: + - GENERATOR="Visual Studio 15 2017 Win64" before_script: - ./checkout_glslang_spirv_tools.sh script: - - ./build_glslang_spirv_tools.sh Debug 2 - - make -j2 - - ./test_shaders.sh + - if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then PYTHON3=$(which python); fi + - if [[ "$TRAVIS_OS_NAME" != "windows" ]]; then PYTHON3=$(which python3); fi + - ./build_glslang_spirv_tools.sh Release + - mkdir build + - cd build + - cmake .. -DCMAKE_BUILD_TYPE=Debug -G "${GENERATOR}" -DPYTHON_EXECUTABLE:FILEPATH="${PYTHON3}" + - cmake --build . + - PATH="../external/glslang-build/output/bin:../external/spirv-tools-build/output/bin:$PATH" ctest --verbose -C Debug diff --git a/CMakeLists.txt b/CMakeLists.txt index c80ae368b..e00f8c779 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -134,32 +134,45 @@ find_package(PythonInterp) if (${PYTHONINTERP_FOUND}) if (${PYTHON_VERSION_MAJOR} GREATER 2) add_test(NAME spirv-cross-test - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py - ${CMAKE_CURRENT_SOURCE_DIR}/shaders) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-no-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-no-opt) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-no-opt + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-metal - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-metal-no-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl-no-opt) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl-no-opt + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-hlsl - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-hlsl-no-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl-no-opt) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl-no-opt + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --opt - ${CMAKE_CURRENT_SOURCE_DIR}/shaders) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --opt --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-metal-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal --opt - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --metal --opt --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-msl + WORKING_DIRECTORY $) add_test(NAME spirv-cross-test-hlsl-opt - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl --opt - ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl) + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --hlsl --opt --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-hlsl + WORKING_DIRECTORY $) + add_test(NAME spirv-cross-test-reflection + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_shaders.py --reflect --parallel + ${CMAKE_CURRENT_SOURCE_DIR}/shaders-reflection + WORKING_DIRECTORY $) endif() else() message(WARNING "Testing disabled. Could not find python3. If you have python3 installed try running " diff --git a/build_glslang_spirv_tools.sh b/build_glslang_spirv_tools.sh index a96642793..1095f3034 100755 --- a/build_glslang_spirv_tools.sh +++ b/build_glslang_spirv_tools.sh @@ -5,22 +5,21 @@ if [ ! -z $1 ]; then PROFILE=$1 fi -NPROC=$(nproc) if [ ! -z $2 ]; then - NPROC=$2 + NPROC="--parallel $2" fi echo "Building glslang." mkdir -p external/glslang-build cd external/glslang-build -cmake ../glslang -DCMAKE_BUILD_TYPE=$PROFILE -G"Unix Makefiles" -make -j$NPROC +cmake ../glslang -DCMAKE_BUILD_TYPE=$PROFILE -DCMAKE_INSTALL_PREFIX=output +cmake --build . --target install ${NPROC} cd ../.. echo "Building SPIRV-Tools." mkdir -p external/spirv-tools-build cd external/spirv-tools-build -cmake ../spirv-tools -DCMAKE_BUILD_TYPE=$PROFILE -G"Unix Makefiles" -DSPIRV_WERROR=OFF -make -j$NPROC +cmake ../spirv-tools -DCMAKE_BUILD_TYPE=$PROFILE -DSPIRV_WERROR=OFF -DCMAKE_INSTALL_PREFIX=output +cmake --build . --target install ${NPROC} cd ../.. diff --git a/checkout_glslang_spirv_tools.sh b/checkout_glslang_spirv_tools.sh index 0679c6785..c90d1daae 100755 --- a/checkout_glslang_spirv_tools.sh +++ b/checkout_glslang_spirv_tools.sh @@ -2,6 +2,7 @@ GLSLANG_REV=91ac4290bcf2cb930b4fb0981f09c00c0b6797e1 SPIRV_TOOLS_REV=9bfe0eb25e3dfdf4f3fd86ab6c0cda009c9bd661 +SPIRV_HEADERS_REV=d5b2e1255f706ce1f88812217e9a554f299848af if [ -d external/glslang ]; then echo "Updating glslang to revision $GLSLANG_REV." @@ -35,9 +36,13 @@ fi if [ -d external/spirv-headers ]; then cd external/spirv-headers git pull origin master + git checkout $SPIRV_HEADERS_REV cd ../.. else git clone git://github.com/KhronosGroup/SPIRV-Headers.git external/spirv-headers + cd external/spirv-headers + git checkout $SPIRV_HEADERS_REV + cd ../.. fi cd ../.. diff --git a/reference/opt/shaders-hlsl/frag/inf-nan-constant.frag b/reference/opt/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/opt/shaders-hlsl/frag/inf-nan-constant.frag rename to reference/opt/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag diff --git a/reference/opt/shaders-msl/frag/inf-nan-constant.frag b/reference/opt/shaders-msl/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/opt/shaders-msl/frag/inf-nan-constant.frag rename to reference/opt/shaders-msl/asm/frag/inf-nan-constant.asm.frag diff --git a/reference/opt/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag b/reference/opt/shaders/asm/frag/inf-nan-constant-double.asm.frag similarity index 100% rename from reference/opt/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag rename to reference/opt/shaders/asm/frag/inf-nan-constant-double.asm.frag diff --git a/reference/opt/shaders/frag/inf-nan-constant.frag b/reference/opt/shaders/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/opt/shaders/frag/inf-nan-constant.frag rename to reference/opt/shaders/asm/frag/inf-nan-constant.asm.frag diff --git a/reference/shaders-hlsl/frag/inf-nan-constant.frag b/reference/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/shaders-hlsl/frag/inf-nan-constant.frag rename to reference/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag diff --git a/reference/shaders-msl/frag/inf-nan-constant.frag b/reference/shaders-msl/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/shaders-msl/frag/inf-nan-constant.frag rename to reference/shaders-msl/asm/frag/inf-nan-constant.asm.frag diff --git a/reference/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag b/reference/shaders/asm/frag/inf-nan-constant-double.asm.frag similarity index 100% rename from reference/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag rename to reference/shaders/asm/frag/inf-nan-constant-double.asm.frag diff --git a/reference/shaders/frag/inf-nan-constant.frag b/reference/shaders/asm/frag/inf-nan-constant.asm.frag similarity index 100% rename from reference/shaders/frag/inf-nan-constant.frag rename to reference/shaders/asm/frag/inf-nan-constant.asm.frag diff --git a/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag b/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag new file mode 100644 index 000000000..40e5d3a89 --- /dev/null +++ b/shaders-hlsl/asm/frag/inf-nan-constant.asm.frag @@ -0,0 +1,29 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 14 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource ESSL 310 + OpName %main "main" + OpName %FragColor "FragColor" + OpDecorate %FragColor Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v3float = OpTypeVector %float 3 +%_ptr_Output_v3float = OpTypePointer Output %v3float + %FragColor = OpVariable %_ptr_Output_v3float Output +%float_0x1p_128 = OpConstant %float 0x1p+128 +%float_n0x1p_128 = OpConstant %float -0x1p+128 +%float_0x1_8p_128 = OpConstant %float 0x1.8p+128 + %13 = OpConstantComposite %v3float %float_0x1p_128 %float_n0x1p_128 %float_0x1_8p_128 + %main = OpFunction %void None %3 + %5 = OpLabel + OpStore %FragColor %13 + OpReturn + OpFunctionEnd diff --git a/shaders-hlsl/frag/inf-nan-constant.frag b/shaders-hlsl/frag/inf-nan-constant.frag deleted file mode 100644 index 78b93c31e..000000000 --- a/shaders-hlsl/frag/inf-nan-constant.frag +++ /dev/null @@ -1,14 +0,0 @@ -#version 310 es -precision highp float; - -const float posinf = 1.0 / 0.0; -const float neginf = -1.0 / 0.0; -const float nan = 0.0 / 0.0; - -layout(location = 0) out vec3 FragColor; - -void main() -{ - FragColor = vec3(posinf, neginf, nan); -} - diff --git a/shaders-msl/asm/frag/inf-nan-constant.asm.frag b/shaders-msl/asm/frag/inf-nan-constant.asm.frag new file mode 100644 index 000000000..40e5d3a89 --- /dev/null +++ b/shaders-msl/asm/frag/inf-nan-constant.asm.frag @@ -0,0 +1,29 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 14 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource ESSL 310 + OpName %main "main" + OpName %FragColor "FragColor" + OpDecorate %FragColor Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v3float = OpTypeVector %float 3 +%_ptr_Output_v3float = OpTypePointer Output %v3float + %FragColor = OpVariable %_ptr_Output_v3float Output +%float_0x1p_128 = OpConstant %float 0x1p+128 +%float_n0x1p_128 = OpConstant %float -0x1p+128 +%float_0x1_8p_128 = OpConstant %float 0x1.8p+128 + %13 = OpConstantComposite %v3float %float_0x1p_128 %float_n0x1p_128 %float_0x1_8p_128 + %main = OpFunction %void None %3 + %5 = OpLabel + OpStore %FragColor %13 + OpReturn + OpFunctionEnd diff --git a/shaders-msl/frag/inf-nan-constant.frag b/shaders-msl/frag/inf-nan-constant.frag deleted file mode 100644 index 78b93c31e..000000000 --- a/shaders-msl/frag/inf-nan-constant.frag +++ /dev/null @@ -1,14 +0,0 @@ -#version 310 es -precision highp float; - -const float posinf = 1.0 / 0.0; -const float neginf = -1.0 / 0.0; -const float nan = 0.0 / 0.0; - -layout(location = 0) out vec3 FragColor; - -void main() -{ - FragColor = vec3(posinf, neginf, nan); -} - diff --git a/shaders/asm/frag/inf-nan-constant-double.asm.frag b/shaders/asm/frag/inf-nan-constant-double.asm.frag new file mode 100644 index 000000000..2d0c18a9d --- /dev/null +++ b/shaders/asm/frag/inf-nan-constant-double.asm.frag @@ -0,0 +1,41 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 22 +; Schema: 0 + OpCapability Shader + OpCapability Float64 + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColor %vTmp + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 450 + OpName %main "main" + OpName %FragColor "FragColor" + OpName %vTmp "vTmp" + OpDecorate %FragColor Location 0 + OpDecorate %vTmp Flat + OpDecorate %vTmp Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v3float = OpTypeVector %float 3 +%_ptr_Output_v3float = OpTypePointer Output %v3float + %FragColor = OpVariable %_ptr_Output_v3float Output + %double = OpTypeFloat 64 + %v3double = OpTypeVector %double 3 +%double_0x1p_1024 = OpConstant %double 0x1p+1024 +%double_n0x1p_1024 = OpConstant %double -0x1p+1024 +%double_0x1_8p_1024 = OpConstant %double 0x1.8p+1024 + %15 = OpConstantComposite %v3double %double_0x1p_1024 %double_n0x1p_1024 %double_0x1_8p_1024 +%_ptr_Input_double = OpTypePointer Input %double + %vTmp = OpVariable %_ptr_Input_double Input + %main = OpFunction %void None %3 + %5 = OpLabel + %18 = OpLoad %double %vTmp + %19 = OpCompositeConstruct %v3double %18 %18 %18 + %20 = OpFAdd %v3double %15 %19 + %21 = OpFConvert %v3float %20 + OpStore %FragColor %21 + OpReturn + OpFunctionEnd diff --git a/shaders/asm/frag/inf-nan-constant.asm.frag b/shaders/asm/frag/inf-nan-constant.asm.frag new file mode 100644 index 000000000..40e5d3a89 --- /dev/null +++ b/shaders/asm/frag/inf-nan-constant.asm.frag @@ -0,0 +1,29 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 14 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource ESSL 310 + OpName %main "main" + OpName %FragColor "FragColor" + OpDecorate %FragColor Location 0 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v3float = OpTypeVector %float 3 +%_ptr_Output_v3float = OpTypePointer Output %v3float + %FragColor = OpVariable %_ptr_Output_v3float Output +%float_0x1p_128 = OpConstant %float 0x1p+128 +%float_n0x1p_128 = OpConstant %float -0x1p+128 +%float_0x1_8p_128 = OpConstant %float 0x1.8p+128 + %13 = OpConstantComposite %v3float %float_0x1p_128 %float_n0x1p_128 %float_0x1_8p_128 + %main = OpFunction %void None %3 + %5 = OpLabel + OpStore %FragColor %13 + OpReturn + OpFunctionEnd diff --git a/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag b/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag deleted file mode 100644 index d2a80fe04..000000000 --- a/shaders/desktop-only/frag/inf-nan-constant-double.desktop.frag +++ /dev/null @@ -1,13 +0,0 @@ -#version 450 - -const double posinf = 1.0lf / 0.0lf; -const double neginf = -1.0lf / 0.0lf; -const double nan = 0.0lf / 0.0lf; - -layout(location = 0) out vec3 FragColor; -layout(location = 0) flat in double vTmp; - -void main() -{ - FragColor = vec3(dvec3(posinf, neginf, nan) + vTmp); -} diff --git a/shaders/frag/inf-nan-constant.frag b/shaders/frag/inf-nan-constant.frag deleted file mode 100644 index 78b93c31e..000000000 --- a/shaders/frag/inf-nan-constant.frag +++ /dev/null @@ -1,14 +0,0 @@ -#version 310 es -precision highp float; - -const float posinf = 1.0 / 0.0; -const float neginf = -1.0 / 0.0; -const float nan = 0.0 / 0.0; - -layout(location = 0) out vec3 FragColor; - -void main() -{ - FragColor = vec3(posinf, neginf, nan); -} - diff --git a/spirv_glsl.cpp b/spirv_glsl.cpp index 113dc0f1c..240c6050d 100644 --- a/spirv_glsl.cpp +++ b/spirv_glsl.cpp @@ -9283,7 +9283,7 @@ void CompilerGLSL::branch(uint32_t from, uint32_t to) // Only sensible solution is to make a ladder variable, which we declare at the top of the switch block, // write to the ladder here, and defer the break. // The loop we're breaking out of must dominate the switch block, or there is no ladder breaking case. - if (current_emitting_switch && is_loop_break(to) && current_emitting_switch->loop_dominator != -1u && + if (current_emitting_switch && is_loop_break(to) && current_emitting_switch->loop_dominator != ~0u && get(current_emitting_switch->loop_dominator).merge_block == to) { if (!current_emitting_switch->need_ladder_break) diff --git a/test_shaders.py b/test_shaders.py index a627b45ea..045c2551b 100755 --- a/test_shaders.py +++ b/test_shaders.py @@ -16,9 +16,6 @@ import errno from functools import partial -backend = 'glsl' -args = {} - def remove_file(path): #print('Removing file:', path) os.remove(path) @@ -194,11 +191,11 @@ def shader_to_win_path(shader): return shader ignore_fxc = False -def validate_shader_hlsl(shader): +def validate_shader_hlsl(shader, force_no_external_validation): subprocess.check_call(['glslangValidator', '-e', 'main', '-D', '--target-env', 'vulkan1.1', '-V', shader]) is_no_fxc = '.nofxc.' in shader global ignore_fxc - if (not ignore_fxc) and (not args.force_no_external_validation) and (not is_no_fxc): + if (not ignore_fxc) and (not force_no_external_validation) and (not is_no_fxc): try: win_path = shader_to_win_path(shader) subprocess.check_call(['fxc', '-nologo', shader_model_hlsl(shader), win_path]) @@ -221,7 +218,7 @@ def shader_to_sm(shader): else: return '50' -def cross_compile_hlsl(shader, spirv, opt): +def cross_compile_hlsl(shader, spirv, opt, force_no_external_validation): spirv_path = create_temporary() hlsl_path = create_temporary(os.path.basename(shader)) @@ -241,7 +238,7 @@ def cross_compile_hlsl(shader, spirv, opt): if not shader_is_invalid_spirv(hlsl_path): subprocess.check_call(['spirv-val', '--target-env', 'vulkan1.1', spirv_path]) - validate_shader_hlsl(hlsl_path) + validate_shader_hlsl(hlsl_path, force_no_external_validation) return (spirv_path, hlsl_path) @@ -496,7 +493,7 @@ def test_shader(stats, shader, update, keep, opt): a.append(str(i)) print(','.join(a), file = stats) -def test_shader_msl(stats, shader, update, keep, opt): +def test_shader_msl(stats, shader, update, keep, opt, force_no_external_validation): joined_path = os.path.join(shader[0], shader[1]) print('\nTesting MSL shader:', joined_path) is_spirv = shader_is_spirv(shader[1]) @@ -512,17 +509,17 @@ def test_shader_msl(stats, shader, update, keep, opt): # executable from Xcode using args: `--msl --entry main --output msl_path spirv_path`. # print('SPRIV shader: ' + spirv) - if not args.force_no_external_validation: + if not force_no_external_validation: validate_shader_msl(shader, opt) remove_file(spirv) -def test_shader_hlsl(stats, shader, update, keep, opt): +def test_shader_hlsl(stats, shader, update, keep, opt, force_no_external_validation): joined_path = os.path.join(shader[0], shader[1]) print('Testing HLSL shader:', joined_path) is_spirv = shader_is_spirv(shader[1]) noopt = shader_is_noopt(shader[1]) - spirv, hlsl = cross_compile_hlsl(joined_path, is_spirv, opt and (not noopt)) + spirv, hlsl = cross_compile_hlsl(joined_path, is_spirv, opt and (not noopt), force_no_external_validation) regression_check(shader, hlsl, update, keep, opt) remove_file(spirv) @@ -535,17 +532,17 @@ def test_shader_reflect(stats, shader, update, keep, opt): regression_check_reflect(shader, reflect, update, keep, opt) remove_file(spirv) -def test_shader_file(relpath, stats, shader_dir, update, keep, opt, backend): +def test_shader_file(relpath, stats, shader_dir, update, keep, opt, force_no_external_validation, backend): if backend == 'msl': - test_shader_msl(stats, (shader_dir, relpath), update, keep, opt) + test_shader_msl(stats, (shader_dir, relpath), update, keep, opt, force_no_external_validation) elif backend == 'hlsl': - test_shader_hlsl(stats, (shader_dir, relpath), update, keep, opt) + test_shader_hlsl(stats, (shader_dir, relpath), update, keep, opt, force_no_external_validation) elif backend == 'reflect': test_shader_reflect(stats, (shader_dir, relpath), update, keep, opt) else: test_shader(stats, (shader_dir, relpath), update, keep, opt) -def test_shaders_helper(stats): +def test_shaders_helper(stats, backend, args): all_files = [] for root, dirs, files in os.walk(os.path.join(args.folder)): files = [ f for f in files if not f.startswith(".") ] #ignore system files (esp OSX) @@ -558,18 +555,25 @@ def test_shaders_helper(stats): # at this point we need to switch to explicit arguments if args.parallel: pool = multiprocessing.Pool(multiprocessing.cpu_count()) - pool.map(partial(test_shader_file, stats=stats, shader_dir=args.folder, update=args.update, keep=args.keep, opt=args.opt, backend=backend), all_files) + pool.map(partial(test_shader_file, + stats = stats, + shader_dir = args.folder, + update = args.update, + keep = args.keep, + opt = args.opt, + force_no_external_validation = args.force_no_external_validation, + backend = backend), all_files) else: for i in all_files: - test_shader_file(i, stats, args.folder, args.update, args.keep, args.opt, backend) + test_shader_file(i, stats, args.folder, args.update, args.keep, args.opt, args.force_no_external_validation, backend) -def test_shaders(): +def test_shaders(backend, args): if args.malisc: with open('stats.csv', 'w') as stats: print('Shader,OrigRegs,OrigUniRegs,OrigALUShort,OrigLSShort,OrigTEXShort,OrigALULong,OrigLSLong,OrigTEXLong,CrossRegs,CrossUniRegs,CrossALUShort,CrossLSShort,CrossTEXShort,CrossALULong,CrossLSLong,CrossTEXLong', file = stats) - test_shaders_helper(stats) + test_shaders_helper(stats, backend, args) else: - test_shaders_helper(None) + test_shaders_helper(None, backend, args) def main(): parser = argparse.ArgumentParser(description = 'Script for regression testing.') @@ -606,7 +610,6 @@ def main(): action = 'store_true', help = 'Execute tests in parallel. Useful for doing regression quickly, but bad for debugging and stat output.') - global args args = parser.parse_args() if not args.folder: sys.stderr.write('Need shader folder.\n') @@ -619,7 +622,7 @@ def main(): if args.msl: print_msl_compiler_version() - global backend + backend = 'glsl' if (args.msl or args.metal): backend = 'msl' elif args.hlsl: @@ -627,7 +630,7 @@ def main(): elif args.reflect: backend = 'reflect' - test_shaders() + test_shaders(backend, args) if args.malisc: print('Stats in stats.csv!') print('Tests completed!') diff --git a/test_shaders.sh b/test_shaders.sh index 8a43afb4d..d49ceb2b4 100755 --- a/test_shaders.sh +++ b/test_shaders.sh @@ -3,7 +3,7 @@ echo "Building spirv-cross" make -j$(nproc) -export PATH="./external/glslang-build/StandAlone:./external/spirv-tools-build/tools:.:$PATH" +export PATH="./external/glslang-build/output/bin:./external/spirv-tools-build/output/bin:.:$PATH" echo "Using glslangValidation in: $(which glslangValidator)." echo "Using spirv-opt in: $(which spirv-opt)." diff --git a/update_test_shaders.sh b/update_test_shaders.sh index 1582c6c3f..2fb5ffa4a 100755 --- a/update_test_shaders.sh +++ b/update_test_shaders.sh @@ -3,7 +3,7 @@ echo "Building spirv-cross" make -j$(nproc) -export PATH="./external/glslang-build/StandAlone:./external/spirv-tools-build/tools:.:$PATH" +export PATH="./external/glslang-build/output/bin:./external/spirv-tools-build/output/bin:.:$PATH" echo "Using glslangValidation in: $(which glslangValidator)." echo "Using spirv-opt in: $(which spirv-opt)."