diff --git a/checkout_glslang_spirv_tools.sh b/checkout_glslang_spirv_tools.sh index e71f507..b751fb8 100755 --- a/checkout_glslang_spirv_tools.sh +++ b/checkout_glslang_spirv_tools.sh @@ -1,7 +1,7 @@ #!/bin/bash -GLSLANG_REV=7cec64fc42eba4587d2f3d73c03cb68ceb18dca4 -SPIRV_TOOLS_REV=fe9121f72144f1e1657cd21a55a1fec07c940e56 +GLSLANG_REV=461ea09943e0e88ea854ab9e3b42d17d728af2ad +SPIRV_TOOLS_REV=53bc1623ecd3cc304d0d6feed8385e70c7ab30d3 if [ -d external/glslang ]; then echo "Updating glslang to revision $GLSLANG_REV." diff --git a/reference/opt/shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp b/reference/opt/shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp similarity index 100% rename from reference/opt/shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp rename to reference/opt/shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp diff --git a/reference/opt/shaders-msl/asm/comp/storage-buffer-basic.asm.comp b/reference/opt/shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from reference/opt/shaders-msl/asm/comp/storage-buffer-basic.asm.comp rename to reference/opt/shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/reference/opt/shaders/asm/comp/storage-buffer-basic.asm.comp b/reference/opt/shaders/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from reference/opt/shaders/asm/comp/storage-buffer-basic.asm.comp rename to reference/opt/shaders/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/reference/opt/shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc b/reference/opt/shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc similarity index 100% rename from reference/opt/shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc rename to reference/opt/shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc diff --git a/reference/opt/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk b/reference/opt/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk new file mode 100644 index 0000000..6d28857 --- /dev/null +++ b/reference/opt/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk @@ -0,0 +1,110 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : require +#extension GL_KHR_shader_subgroup_ballot : require +#extension GL_KHR_shader_subgroup_shuffle : require +#extension GL_KHR_shader_subgroup_shuffle_relative : require +#extension GL_KHR_shader_subgroup_vote : require +#extension GL_KHR_shader_subgroup_arithmetic : require +#extension GL_KHR_shader_subgroup_clustered : require +#extension GL_KHR_shader_subgroup_quad : require +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; + +layout(set = 0, binding = 0, std430) buffer SSBO +{ + float FragColor; +} _9; + +void main() +{ + _9.FragColor = float(gl_NumSubgroups); + _9.FragColor = float(gl_SubgroupID); + _9.FragColor = float(gl_SubgroupSize); + _9.FragColor = float(gl_SubgroupInvocationID); + subgroupMemoryBarrier(); + subgroupBarrier(); + subgroupMemoryBarrier(); + subgroupMemoryBarrierBuffer(); + subgroupMemoryBarrierShared(); + subgroupMemoryBarrierImage(); + bool elected = subgroupElect(); + _9.FragColor = vec4(gl_SubgroupEqMask).x; + _9.FragColor = vec4(gl_SubgroupGeMask).x; + _9.FragColor = vec4(gl_SubgroupGtMask).x; + _9.FragColor = vec4(gl_SubgroupLeMask).x; + _9.FragColor = vec4(gl_SubgroupLtMask).x; + vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u); + vec3 first = subgroupBroadcastFirst(vec3(20.0)); + uvec4 ballot_value = subgroupBallot(true); + bool inverse_ballot_value = subgroupInverseBallot(ballot_value); + bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u); + uint bit_count = subgroupBallotBitCount(ballot_value); + uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value); + uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value); + uint lsb = subgroupBallotFindLSB(ballot_value); + uint msb = subgroupBallotFindMSB(ballot_value); + uint shuffled = subgroupShuffle(10u, 8u); + uint shuffled_xor = subgroupShuffleXor(30u, 8u); + uint shuffled_up = subgroupShuffleUp(20u, 4u); + uint shuffled_down = subgroupShuffleDown(20u, 4u); + bool has_all = subgroupAll(true); + bool has_any = subgroupAny(true); + bool has_equal = subgroupAllEqual(true); + vec4 added = subgroupAdd(vec4(20.0)); + ivec4 iadded = subgroupAdd(ivec4(20)); + vec4 multiplied = subgroupMul(vec4(20.0)); + ivec4 imultiplied = subgroupMul(ivec4(20)); + vec4 lo = subgroupMin(vec4(20.0)); + vec4 hi = subgroupMax(vec4(20.0)); + ivec4 slo = subgroupMin(ivec4(20)); + ivec4 shi = subgroupMax(ivec4(20)); + uvec4 ulo = subgroupMin(uvec4(20u)); + uvec4 uhi = subgroupMax(uvec4(20u)); + uvec4 anded = subgroupAnd(ballot_value); + uvec4 ored = subgroupOr(ballot_value); + uvec4 xored = subgroupXor(ballot_value); + added = subgroupInclusiveAdd(added); + iadded = subgroupInclusiveAdd(iadded); + multiplied = subgroupInclusiveMul(multiplied); + imultiplied = subgroupInclusiveMul(imultiplied); + lo = subgroupInclusiveMin(lo); + hi = subgroupInclusiveMax(hi); + slo = subgroupInclusiveMin(slo); + shi = subgroupInclusiveMax(shi); + ulo = subgroupInclusiveMin(ulo); + uhi = subgroupInclusiveMax(uhi); + anded = subgroupInclusiveAnd(anded); + ored = subgroupInclusiveOr(ored); + xored = subgroupInclusiveXor(ored); + added = subgroupExclusiveAdd(lo); + added = subgroupExclusiveAdd(multiplied); + multiplied = subgroupExclusiveMul(multiplied); + iadded = subgroupExclusiveAdd(imultiplied); + imultiplied = subgroupExclusiveMul(imultiplied); + lo = subgroupExclusiveMin(lo); + hi = subgroupExclusiveMax(hi); + ulo = subgroupExclusiveMin(ulo); + uhi = subgroupExclusiveMax(uhi); + slo = subgroupExclusiveMin(slo); + shi = subgroupExclusiveMax(shi); + anded = subgroupExclusiveAnd(anded); + ored = subgroupExclusiveOr(ored); + xored = subgroupExclusiveXor(ored); + added = subgroupClusteredAdd(added, 4u); + multiplied = subgroupClusteredMul(multiplied, 4u); + iadded = subgroupClusteredAdd(iadded, 4u); + imultiplied = subgroupClusteredMul(imultiplied, 4u); + lo = subgroupClusteredMin(lo, 4u); + hi = subgroupClusteredMax(hi, 4u); + ulo = subgroupClusteredMin(ulo, 4u); + uhi = subgroupClusteredMax(uhi, 4u); + slo = subgroupClusteredMin(slo, 4u); + shi = subgroupClusteredMax(shi, 4u); + anded = subgroupClusteredAnd(anded, 4u); + ored = subgroupClusteredOr(ored, 4u); + xored = subgroupClusteredXor(xored, 4u); + vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0)); + vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0)); + vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0)); + vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u); +} + diff --git a/reference/shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp b/reference/shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp similarity index 100% rename from reference/shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp rename to reference/shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp diff --git a/reference/shaders-msl/asm/comp/storage-buffer-basic.asm.comp b/reference/shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from reference/shaders-msl/asm/comp/storage-buffer-basic.asm.comp rename to reference/shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/reference/shaders/asm/comp/storage-buffer-basic.asm.comp b/reference/shaders/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from reference/shaders/asm/comp/storage-buffer-basic.asm.comp rename to reference/shaders/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/reference/shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc b/reference/shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc similarity index 100% rename from reference/shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc rename to reference/shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc diff --git a/reference/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk b/reference/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk new file mode 100644 index 0000000..6d28857 --- /dev/null +++ b/reference/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp.vk @@ -0,0 +1,110 @@ +#version 450 +#extension GL_KHR_shader_subgroup_basic : require +#extension GL_KHR_shader_subgroup_ballot : require +#extension GL_KHR_shader_subgroup_shuffle : require +#extension GL_KHR_shader_subgroup_shuffle_relative : require +#extension GL_KHR_shader_subgroup_vote : require +#extension GL_KHR_shader_subgroup_arithmetic : require +#extension GL_KHR_shader_subgroup_clustered : require +#extension GL_KHR_shader_subgroup_quad : require +layout(local_size_x = 1, local_size_y = 1, local_size_z = 1) in; + +layout(set = 0, binding = 0, std430) buffer SSBO +{ + float FragColor; +} _9; + +void main() +{ + _9.FragColor = float(gl_NumSubgroups); + _9.FragColor = float(gl_SubgroupID); + _9.FragColor = float(gl_SubgroupSize); + _9.FragColor = float(gl_SubgroupInvocationID); + subgroupMemoryBarrier(); + subgroupBarrier(); + subgroupMemoryBarrier(); + subgroupMemoryBarrierBuffer(); + subgroupMemoryBarrierShared(); + subgroupMemoryBarrierImage(); + bool elected = subgroupElect(); + _9.FragColor = vec4(gl_SubgroupEqMask).x; + _9.FragColor = vec4(gl_SubgroupGeMask).x; + _9.FragColor = vec4(gl_SubgroupGtMask).x; + _9.FragColor = vec4(gl_SubgroupLeMask).x; + _9.FragColor = vec4(gl_SubgroupLtMask).x; + vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u); + vec3 first = subgroupBroadcastFirst(vec3(20.0)); + uvec4 ballot_value = subgroupBallot(true); + bool inverse_ballot_value = subgroupInverseBallot(ballot_value); + bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u); + uint bit_count = subgroupBallotBitCount(ballot_value); + uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value); + uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value); + uint lsb = subgroupBallotFindLSB(ballot_value); + uint msb = subgroupBallotFindMSB(ballot_value); + uint shuffled = subgroupShuffle(10u, 8u); + uint shuffled_xor = subgroupShuffleXor(30u, 8u); + uint shuffled_up = subgroupShuffleUp(20u, 4u); + uint shuffled_down = subgroupShuffleDown(20u, 4u); + bool has_all = subgroupAll(true); + bool has_any = subgroupAny(true); + bool has_equal = subgroupAllEqual(true); + vec4 added = subgroupAdd(vec4(20.0)); + ivec4 iadded = subgroupAdd(ivec4(20)); + vec4 multiplied = subgroupMul(vec4(20.0)); + ivec4 imultiplied = subgroupMul(ivec4(20)); + vec4 lo = subgroupMin(vec4(20.0)); + vec4 hi = subgroupMax(vec4(20.0)); + ivec4 slo = subgroupMin(ivec4(20)); + ivec4 shi = subgroupMax(ivec4(20)); + uvec4 ulo = subgroupMin(uvec4(20u)); + uvec4 uhi = subgroupMax(uvec4(20u)); + uvec4 anded = subgroupAnd(ballot_value); + uvec4 ored = subgroupOr(ballot_value); + uvec4 xored = subgroupXor(ballot_value); + added = subgroupInclusiveAdd(added); + iadded = subgroupInclusiveAdd(iadded); + multiplied = subgroupInclusiveMul(multiplied); + imultiplied = subgroupInclusiveMul(imultiplied); + lo = subgroupInclusiveMin(lo); + hi = subgroupInclusiveMax(hi); + slo = subgroupInclusiveMin(slo); + shi = subgroupInclusiveMax(shi); + ulo = subgroupInclusiveMin(ulo); + uhi = subgroupInclusiveMax(uhi); + anded = subgroupInclusiveAnd(anded); + ored = subgroupInclusiveOr(ored); + xored = subgroupInclusiveXor(ored); + added = subgroupExclusiveAdd(lo); + added = subgroupExclusiveAdd(multiplied); + multiplied = subgroupExclusiveMul(multiplied); + iadded = subgroupExclusiveAdd(imultiplied); + imultiplied = subgroupExclusiveMul(imultiplied); + lo = subgroupExclusiveMin(lo); + hi = subgroupExclusiveMax(hi); + ulo = subgroupExclusiveMin(ulo); + uhi = subgroupExclusiveMax(uhi); + slo = subgroupExclusiveMin(slo); + shi = subgroupExclusiveMax(shi); + anded = subgroupExclusiveAnd(anded); + ored = subgroupExclusiveOr(ored); + xored = subgroupExclusiveXor(ored); + added = subgroupClusteredAdd(added, 4u); + multiplied = subgroupClusteredMul(multiplied, 4u); + iadded = subgroupClusteredAdd(iadded, 4u); + imultiplied = subgroupClusteredMul(imultiplied, 4u); + lo = subgroupClusteredMin(lo, 4u); + hi = subgroupClusteredMax(hi, 4u); + ulo = subgroupClusteredMin(ulo, 4u); + uhi = subgroupClusteredMax(uhi, 4u); + slo = subgroupClusteredMin(slo, 4u); + shi = subgroupClusteredMax(shi, 4u); + anded = subgroupClusteredAnd(anded, 4u); + ored = subgroupClusteredOr(ored, 4u); + xored = subgroupClusteredXor(xored, 4u); + vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0)); + vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0)); + vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0)); + vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u); +} + diff --git a/shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp b/shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp similarity index 100% rename from shaders-hlsl/asm/comp/storage-buffer-basic.nofxc.asm.comp rename to shaders-hlsl/asm/comp/storage-buffer-basic.invalid.nofxc.asm.comp diff --git a/shaders-msl/asm/comp/storage-buffer-basic.asm.comp b/shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from shaders-msl/asm/comp/storage-buffer-basic.asm.comp rename to shaders-msl/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/shaders/asm/comp/storage-buffer-basic.asm.comp b/shaders/asm/comp/storage-buffer-basic.invalid.asm.comp similarity index 100% rename from shaders/asm/comp/storage-buffer-basic.asm.comp rename to shaders/asm/comp/storage-buffer-basic.invalid.asm.comp diff --git a/shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc b/shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc similarity index 100% rename from shaders/asm/tesc/tess-fixed-input-array-builtin-array.asm.tesc rename to shaders/asm/tesc/tess-fixed-input-array-builtin-array.invalid.asm.tesc diff --git a/shaders/vulkan/comp/subgroups.nocompat.vk.comp b/shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp similarity index 100% rename from shaders/vulkan/comp/subgroups.nocompat.vk.comp rename to shaders/vulkan/comp/subgroups.nocompat.invalid.vk.comp diff --git a/test_shaders.py b/test_shaders.py index bbf2456..217e81c 100755 --- a/test_shaders.py +++ b/test_shaders.py @@ -97,7 +97,7 @@ def cross_compile_msl(shader, spirv, opt): if spirv: subprocess.check_call(['spirv-as', '-o', spirv_path, shader]) else: - subprocess.check_call(['glslangValidator', '-V', '-o', spirv_path, shader]) + subprocess.check_call(['glslangValidator', '--target-env', 'vulkan1.1', '-V', '-o', spirv_path, shader]) if opt: subprocess.check_call(['spirv-opt', '-O', '-o', spirv_path, spirv_path]) @@ -110,7 +110,10 @@ def cross_compile_msl(shader, spirv, opt): msl_args.append('20000') subprocess.check_call(msl_args) - subprocess.check_call(['spirv-val', spirv_path]) + + if not shader_is_invalid_spirv(msl_path): + subprocess.check_call(['spirv-val', '--target-env', 'vulkan1.1', spirv_path]) + return (spirv_path, msl_path) def shader_model_hlsl(shader): @@ -138,7 +141,7 @@ def shader_to_win_path(shader): return shader def validate_shader_hlsl(shader): - subprocess.check_call(['glslangValidator', '-e', 'main', '-D', '-V', shader]) + subprocess.check_call(['glslangValidator', '-e', 'main', '-D', '--target-env', 'vulkan1.1', '-V', shader]) is_no_fxc = '.nofxc.' in shader if (not force_no_external_validation) and (not is_no_fxc): try: @@ -168,7 +171,7 @@ def cross_compile_hlsl(shader, spirv, opt): if spirv: subprocess.check_call(['spirv-as', '-o', spirv_path, shader]) else: - subprocess.check_call(['glslangValidator', '-V', '-o', spirv_path, shader]) + subprocess.check_call(['glslangValidator', '--target-env', 'vulkan1.1', '-V', '-o', spirv_path, shader]) if opt: subprocess.check_call(['spirv-opt', '-O', '-o', spirv_path, spirv_path]) @@ -177,7 +180,9 @@ def cross_compile_hlsl(shader, spirv, opt): sm = shader_to_sm(shader) subprocess.check_call([spirv_cross_path, '--entry', 'main', '--output', hlsl_path, spirv_path, '--hlsl-enable-compat', '--hlsl', '--shader-model', sm]) - subprocess.check_call(['spirv-val', spirv_path]) + + if not shader_is_invalid_spirv(hlsl_path): + subprocess.check_call(['spirv-val', '--target-env', 'vulkan1.1', spirv_path]) validate_shader_hlsl(hlsl_path) @@ -185,7 +190,7 @@ def cross_compile_hlsl(shader, spirv, opt): def validate_shader(shader, vulkan): if vulkan: - subprocess.check_call(['glslangValidator', '-V', shader]) + subprocess.check_call(['glslangValidator', '--target-env', 'vulkan1.1', '-V', shader]) else: subprocess.check_call(['glslangValidator', shader]) @@ -202,13 +207,13 @@ def cross_compile(shader, vulkan, spirv, invalid_spirv, eliminate, is_legacy, fl if spirv: subprocess.check_call(['spirv-as', '-o', spirv_path, shader]) else: - subprocess.check_call(['glslangValidator', '-V', '-o', spirv_path, shader]) + subprocess.check_call(['glslangValidator', '--target-env', 'vulkan1.1', '-V', '-o', spirv_path, shader]) if opt and (not invalid_spirv): subprocess.check_call(['spirv-opt', '-O', '-o', spirv_path, spirv_path]) if not invalid_spirv: - subprocess.check_call(['spirv-val', spirv_path]) + subprocess.check_call(['spirv-val', '--target-env', 'vulkan1.1', spirv_path]) extra_args = [] if eliminate: @@ -223,11 +228,14 @@ def cross_compile(shader, vulkan, spirv, invalid_spirv, eliminate, is_legacy, fl extra_args += ['--flatten-multidimensional-arrays'] spirv_cross_path = './spirv-cross' - subprocess.check_call([spirv_cross_path, '--entry', 'main', '--output', glsl_path, spirv_path] + extra_args) # A shader might not be possible to make valid GLSL from, skip validation for this case. if (not ('nocompat' in glsl_path)) and (not spirv): + subprocess.check_call([spirv_cross_path, '--entry', 'main', '--output', glsl_path, spirv_path] + extra_args) validate_shader(glsl_path, False) + else: + os.remove(glsl_path) + glsl_path = None if vulkan or spirv: subprocess.check_call([spirv_cross_path, '--entry', 'main', '--vulkan-semantics', '--output', vulkan_glsl_path, spirv_path] + extra_args) @@ -343,7 +351,8 @@ def test_shader(stats, shader, update, keep, opt): if stats and (not vulkan) and (not is_spirv) and (not desktop): cross_stats = get_shader_stats(glsl) - regression_check(shader, glsl, update, keep, opt) + if glsl: + regression_check(shader, glsl, update, keep, opt) if vulkan_glsl: regression_check((shader[0], shader[1] + '.vk'), vulkan_glsl, update, keep, opt) os.remove(spirv)