From 06e8c2e7ed83f230b21596be2333dc4ee66f85b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=91=D1=80=D0=B0=D0=BD=D0=B8=D0=BC=D0=B8=D1=80=20=D0=9A?= =?UTF-8?q?=D0=B0=D1=80=D0=B0=D1=9F=D0=B8=D1=9B?= Date: Fri, 1 Feb 2019 21:35:55 -0800 Subject: [PATCH] Updated spirv-cross. --- .../checkout_glslang_spirv_tools.sh | 6 +- .../storage-class-output-initializer.asm.frag | 23 ++ .../asm/frag/unreachable.asm.frag | 10 +- .../asm/vert/vertex-id-instance-id.asm.vert | 14 +- .../comp/spec-constant-op-member-array.comp | 2 +- .../frag/sample-cmp-level-zero.frag | 17 +- .../frag/spec-constant-ternary.frag | 4 +- .../opt/shaders-hlsl/frag/tex-sampling.frag | 20 +- .../frag/texture-proj-shadow.frag | 25 +- .../opt/shaders-hlsl/vert/basic.vert | 2 +- .../asm/comp/block-name-alias-global.asm.comp | 4 +- .../storage-class-output-initializer.asm.frag | 24 ++ .../shaders-msl/asm/frag/unreachable.asm.frag | 10 +- .../asm/frag/vector-shuffle-oom.asm.frag | 2 +- .../opt/shaders-msl/comp/atomic.comp | 2 + .../comp/bitcast-16bit-1.invalid.comp | 2 +- .../comp/spec-constant-op-member-array.comp | 4 +- .../opt/shaders-msl/comp/struct-packing.comp | 10 +- .../frag/shader-arithmetic-8bit.frag | 77 +++++ .../frag/spec-constant-ternary.frag | 4 +- .../shaders-msl/frag/texture-proj-shadow.frag | 2 +- .../vert/no_stage_out.write_buff.vert | 6 +- .../opt/shaders-msl/vert/packed_matrix.vert | 2 +- .../vert/resource-arrays-leaf.ios.vert | 16 +- .../shaders-msl/vert/resource-arrays.ios.vert | 16 +- .../opt/shaders-msl/vert/ubo.alignment.vert | 2 +- .../asm/comp/hlsl-functionality.asm.comp | 2 +- ...op-body-dominator-continue-access.asm.frag | 18 +- .../storage-class-output-initializer.asm.frag | 11 + .../asm/frag/temporary-phi-hoisting.asm.frag | 2 +- .../opt/shaders/asm/frag/unreachable.asm.frag | 9 +- .../shaders/comp/bitcast-16bit-1.invalid.comp | 6 +- .../shaders/comp/bitcast-16bit-2.invalid.comp | 4 - .../frag/fp16.invalid.desktop.frag | 2 - .../desktop-only/vert/basic.desktop.sso.vert | 2 +- .../opt/shaders/frag/16bit-constants.frag | 4 - .../opt/shaders/tesc/water_tess.tesc | 2 +- .../reference/opt/shaders/vert/basic.vert | 2 +- .../spec-constant-op-member-array.vk.comp | 4 +- .../spec-constant-op-member-array.vk.comp.vk | 4 +- ...shader-arithmetic-8bit.nocompat.vk.frag.vk | 69 +++++ .../vulkan/frag/spec-constant-ternary.vk.frag | 4 +- .../frag/spec-constant-ternary.vk.frag.vk | 4 +- .../shaders/vulkan/vert/small-storage.vk.vert | 6 +- .../vulkan/vert/small-storage.vk.vert.vk | 12 +- .../storage-class-output-initializer.asm.frag | 23 ++ .../asm/vert/vertex-id-instance-id.asm.vert | 14 +- .../comp/spec-constant-op-member-array.comp | 2 +- .../frag/sample-cmp-level-zero.frag | 19 +- .../frag/spec-constant-ternary.frag | 4 +- .../shaders-hlsl/frag/tex-sampling.frag | 24 +- .../frag/texture-proj-shadow.frag | 25 +- .../reference/shaders-hlsl/vert/basic.vert | 2 +- .../asm/frag/texture-access.swizzle.asm.frag | 4 +- .../frag/texture-access-leaf.swizzle.frag | 4 +- .../frag/texture-access.swizzle.frag | 4 +- .../texture-access-function.swizzle.vk.frag | 4 +- .../asm/comp/block-name-alias-global.asm.comp | 4 +- .../storage-class-output-initializer.asm.frag | 24 ++ .../asm/frag/vector-shuffle-oom.asm.frag | 2 +- .../comp/bitcast-16bit-1.invalid.comp | 2 +- .../comp/spec-constant-op-member-array.comp | 4 +- .../shaders-msl/comp/struct-packing.comp | 10 +- .../frag/shader-arithmetic-8bit.frag | 98 +++++++ .../frag/spec-constant-ternary.frag | 4 +- .../shaders-msl/frag/texture-proj-shadow.frag | 2 +- .../shaders-msl/vert/packed_matrix.vert | 2 +- .../vert/resource-arrays-leaf.ios.vert | 16 +- .../shaders-msl/vert/resource-arrays.ios.vert | 16 +- .../shaders-msl/vert/ubo.alignment.vert | 2 +- .../asm/comp/hlsl-functionality.asm.comp | 2 +- .../storage-class-output-initializer.asm.frag | 11 + .../asm/frag/temporary-phi-hoisting.asm.frag | 2 +- .../shaders/comp/bitcast-16bit-1.invalid.comp | 6 +- .../shaders/comp/bitcast-16bit-2.invalid.comp | 4 - .../frag/fp16.invalid.desktop.frag | 2 - .../desktop-only/vert/basic.desktop.sso.vert | 2 +- .../shaders/frag/16bit-constants.frag | 4 - .../reference/shaders/tesc/water_tess.tesc | 2 +- .../reference/shaders/vert/basic.vert | 2 +- .../spec-constant-op-member-array.vk.comp | 4 +- .../spec-constant-op-member-array.vk.comp.vk | 4 +- ...shader-arithmetic-8bit.nocompat.vk.frag.vk | 88 ++++++ .../vulkan/frag/spec-constant-ternary.vk.frag | 4 +- .../frag/spec-constant-ternary.vk.frag.vk | 4 +- .../shaders/vulkan/vert/small-storage.vk.vert | 6 +- .../vulkan/vert/small-storage.vk.vert.vk | 12 +- .../asm/vert/empty-struct-composite.asm.vert | 1 - .../storage-class-output-initializer.asm.frag | 41 +++ .../asm/vert/vertex-id-instance-id.asm.vert | 4 +- .../asm/vert/empty-struct-composite.asm.vert | 1 - .../asm/comp/buffer-write.asm.comp | 1 + .../asm/comp/multiple-entry.asm.comp | 1 + .../struct-resource-name-aliasing.asm.comp | 2 + .../asm/frag/default-member-names.asm.frag | 2 +- .../extract-packed-from-composite.asm.frag | 1 + .../asm/frag/locations-components.asm.frag | 1 + .../asm/frag/op-image-sampled-image.asm.frag | 1 + .../storage-class-output-initializer.asm.frag | 41 +++ .../frag/shader-arithmetic-8bit.frag | 88 ++++++ .../vert/resource-arrays-leaf.ios.vert | 5 +- .../shaders-msl/vert/resource-arrays.ios.vert | 6 +- .../asm/vert/empty-struct-composite.asm.vert | 1 - .../asm/comp/hlsl-functionality.asm.comp | 1 + .../shaders/asm/comp/multiple-entry.asm.comp | 1 + .../asm/frag/default-member-names.asm.frag | 2 +- .../asm/frag/locations-components.asm.frag | 1 + .../storage-class-output-initializer.asm.frag | 41 +++ .../asm/frag/temporary-phi-hoisting.asm.frag | 1 + .../shader-arithmetic-8bit.nocompat.vk.frag | 88 ++++++ 3rdparty/spirv-cross/spirv_common.hpp | 65 +++++ 3rdparty/spirv-cross/spirv_cross.cpp | 6 + 3rdparty/spirv-cross/spirv_glsl.cpp | 272 +++++++++++++----- 3rdparty/spirv-cross/spirv_glsl.hpp | 2 + 3rdparty/spirv-cross/spirv_hlsl.cpp | 129 +++------ 3rdparty/spirv-cross/spirv_hlsl.hpp | 1 - 3rdparty/spirv-cross/spirv_msl.cpp | 199 ++++++++----- 3rdparty/spirv-cross/spirv_parser.cpp | 18 +- 3rdparty/spirv-cross/spirv_reflect.cpp | 3 +- 119 files changed, 1401 insertions(+), 573 deletions(-) create mode 100644 3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/opt/shaders-msl/frag/shader-arithmetic-8bit.frag create mode 100644 3rdparty/spirv-cross/reference/opt/shaders/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk create mode 100644 3rdparty/spirv-cross/reference/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/shaders-msl/frag/shader-arithmetic-8bit.frag create mode 100644 3rdparty/spirv-cross/reference/shaders/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/reference/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk create mode 100644 3rdparty/spirv-cross/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/shaders-msl/frag/shader-arithmetic-8bit.frag create mode 100644 3rdparty/spirv-cross/shaders/asm/frag/storage-class-output-initializer.asm.frag create mode 100644 3rdparty/spirv-cross/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag diff --git a/3rdparty/spirv-cross/checkout_glslang_spirv_tools.sh b/3rdparty/spirv-cross/checkout_glslang_spirv_tools.sh index c90d1daae..2ccc6c89e 100755 --- a/3rdparty/spirv-cross/checkout_glslang_spirv_tools.sh +++ b/3rdparty/spirv-cross/checkout_glslang_spirv_tools.sh @@ -1,8 +1,8 @@ #!/bin/bash -GLSLANG_REV=91ac4290bcf2cb930b4fb0981f09c00c0b6797e1 -SPIRV_TOOLS_REV=9bfe0eb25e3dfdf4f3fd86ab6c0cda009c9bd661 -SPIRV_HEADERS_REV=d5b2e1255f706ce1f88812217e9a554f299848af +GLSLANG_REV=c9e03360e2a78a95a8571292aefa5ddbdbf66daf +SPIRV_TOOLS_REV=e2279da7148d19bd21c6d47ffc96ee4176f43dba +SPIRV_HEADERS_REV=8bea0a266ac9b718aa0818d9e3a47c0b77c2cb23 if [ -d external/glslang ]; then echo "Updating glslang to revision $GLSLANG_REV." diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..1905b5ea2 --- /dev/null +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,23 @@ +static const float4 _20[2] = { float4(1.0f, 2.0f, 3.0f, 4.0f), 10.0f.xxxx }; + +static float4 FragColors[2] = _20; +static float4 FragColor = 5.0f.xxxx; + +struct SPIRV_Cross_Output +{ + float4 FragColors[2] : SV_Target0; + float4 FragColor : SV_Target2; +}; + +void frag_main() +{ +} + +SPIRV_Cross_Output main() +{ + frag_main(); + SPIRV_Cross_Output stage_output; + stage_output.FragColors = FragColors; + stage_output.FragColor = FragColor; + return stage_output; +} diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/unreachable.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/unreachable.asm.frag index ee3e46724..4a024c8ef 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/unreachable.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/frag/unreachable.asm.frag @@ -13,21 +13,21 @@ struct SPIRV_Cross_Output void frag_main() { - bool _29; + float4 _33; for (;;) { - _29 = counter == 10; - if (_29) + if (counter == 10) { + _33 = 10.0f.xxxx; break; } else { + _33 = 30.0f.xxxx; break; } } - bool4 _35 = _29.xxxx; - FragColor = float4(_35.x ? 10.0f.xxxx.x : 30.0f.xxxx.x, _35.y ? 10.0f.xxxx.y : 30.0f.xxxx.y, _35.z ? 10.0f.xxxx.z : 30.0f.xxxx.z, _35.w ? 10.0f.xxxx.w : 30.0f.xxxx.w); + FragColor = _33; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert index 8d5e771fe..48b2df20d 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert @@ -1,10 +1,10 @@ static float4 gl_Position; -static int gl_VertexID; -static int gl_InstanceID; +static int gl_VertexIndex; +static int gl_InstanceIndex; struct SPIRV_Cross_Input { - uint gl_VertexID : SV_VertexID; - uint gl_InstanceID : SV_InstanceID; + uint gl_VertexIndex : SV_VertexID; + uint gl_InstanceIndex : SV_InstanceID; }; struct SPIRV_Cross_Output @@ -14,13 +14,13 @@ struct SPIRV_Cross_Output void vert_main() { - gl_Position = float(gl_VertexID + gl_InstanceID).xxxx; + gl_Position = float(gl_VertexIndex + gl_InstanceIndex).xxxx; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { - gl_VertexID = int(stage_input.gl_VertexID); - gl_InstanceID = int(stage_input.gl_InstanceID); + gl_VertexIndex = int(stage_input.gl_VertexIndex); + gl_InstanceIndex = int(stage_input.gl_InstanceIndex); vert_main(); SPIRV_Cross_Output stage_output; stage_output.gl_Position = gl_Position; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/comp/spec-constant-op-member-array.comp b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/comp/spec-constant-op-member-array.comp index c35031b84..c4537db03 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/comp/spec-constant-op-member-array.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/comp/spec-constant-op-member-array.comp @@ -23,7 +23,7 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif static const int c = SPIRV_CROSS_CONSTANT_ID_2; -static const int _18 = (c + 50); +static const int d = (c + 50); #ifndef SPIRV_CROSS_CONSTANT_ID_3 #define SPIRV_CROSS_CONSTANT_ID_3 400 #endif diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/sample-cmp-level-zero.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/sample-cmp-level-zero.frag index b6e91ce7b..c6539b183 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/sample-cmp-level-zero.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/sample-cmp-level-zero.frag @@ -22,26 +22,11 @@ struct SPIRV_Cross_Output float FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { float4 _80 = vDirRef; _80.z = vDirRef.w; - FragColor = (((((((uSampler2D.SampleCmp(_uSampler2D_sampler, vUVRef.xy, vUVRef.z, int2(-1, -1)) + uSampler2DArray.SampleCmp(_uSampler2DArray_sampler, vDirRef.xyz, vDirRef.w, int2(-1, -1))) + uSamplerCube.SampleCmp(_uSamplerCube_sampler, vDirRef.xyz, vDirRef.w)) + uSamplerCubeArray.SampleCmp(_uSamplerCubeArray_sampler, vDirRef, 0.5f)) + uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, vUVRef.xy, vUVRef.z, int2(-1, -1))) + uSampler2DArray.SampleCmpLevelZero(_uSampler2DArray_sampler, vDirRef.xyz, vDirRef.w, int2(-1, -1))) + uSamplerCube.SampleCmpLevelZero(_uSamplerCube_sampler, vDirRef.xyz, vDirRef.w)) + uSampler2D.SampleCmp(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(_80.xyz), vDirRef.z, int2(1, 1))) + uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(_80.xyz), vDirRef.z, int2(1, 1)); + FragColor = (((((((uSampler2D.SampleCmp(_uSampler2D_sampler, vUVRef.xy, vUVRef.z, int2(-1, -1)) + uSampler2DArray.SampleCmp(_uSampler2DArray_sampler, vDirRef.xyz, vDirRef.w, int2(-1, -1))) + uSamplerCube.SampleCmp(_uSamplerCube_sampler, vDirRef.xyz, vDirRef.w)) + uSamplerCubeArray.SampleCmp(_uSamplerCubeArray_sampler, vDirRef, 0.5f)) + uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, vUVRef.xy, vUVRef.z, int2(-1, -1))) + uSampler2DArray.SampleCmpLevelZero(_uSampler2DArray_sampler, vDirRef.xyz, vDirRef.w, int2(-1, -1))) + uSamplerCube.SampleCmpLevelZero(_uSamplerCube_sampler, vDirRef.xyz, vDirRef.w)) + uSampler2D.SampleCmp(_uSampler2D_sampler, _80.xy / _80.z, vDirRef.z / _80.z, int2(1, 1))) + uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, _80.xy / _80.z, vDirRef.z / _80.z, int2(1, 1)); } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/spec-constant-ternary.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/spec-constant-ternary.frag index 58735aad0..942da54f0 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/spec-constant-ternary.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/spec-constant-ternary.frag @@ -3,7 +3,7 @@ #endif static const uint s = SPIRV_CROSS_CONSTANT_ID_0; static const bool _13 = (s > 20u); -static const uint _16 = _13 ? 30u : 50u; +static const uint f = _13 ? 30u : 50u; static float FragColor; @@ -14,7 +14,7 @@ struct SPIRV_Cross_Output void frag_main() { - FragColor = float(_16); + FragColor = float(f); } SPIRV_Cross_Output main() diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/tex-sampling.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/tex-sampling.frag index 2112059a5..4f8e8f091 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/tex-sampling.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/tex-sampling.frag @@ -42,24 +42,12 @@ struct SPIRV_Cross_Output float4 FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { - float4 _162 = (((((((((((((((((((tex1d.Sample(_tex1d_sampler, texCoord1d) + tex1d.Sample(_tex1d_sampler, texCoord1d, 1)) + tex1d.SampleLevel(_tex1d_sampler, texCoord1d, 2.0f)) + tex1d.SampleGrad(_tex1d_sampler, texCoord1d, 1.0f, 2.0f)) + tex1d.Sample(_tex1d_sampler, SPIRV_Cross_projectTextureCoordinate(float2(texCoord1d, 2.0f)))) + tex1d.SampleBias(_tex1d_sampler, texCoord1d, 1.0f)) + tex2d.Sample(_tex2d_sampler, texCoord2d)) + tex2d.Sample(_tex2d_sampler, texCoord2d, int2(1, 2))) + tex2d.SampleLevel(_tex2d_sampler, texCoord2d, 2.0f)) + tex2d.SampleGrad(_tex2d_sampler, texCoord2d, float2(1.0f, 2.0f), float2(3.0f, 4.0f))) + tex2d.Sample(_tex2d_sampler, SPIRV_Cross_projectTextureCoordinate(float3(texCoord2d, 2.0f)))) + tex2d.SampleBias(_tex2d_sampler, texCoord2d, 1.0f)) + tex3d.Sample(_tex3d_sampler, texCoord3d)) + tex3d.Sample(_tex3d_sampler, texCoord3d, int3(1, 2, 3))) + tex3d.SampleLevel(_tex3d_sampler, texCoord3d, 2.0f)) + tex3d.SampleGrad(_tex3d_sampler, texCoord3d, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f))) + tex3d.Sample(_tex3d_sampler, SPIRV_Cross_projectTextureCoordinate(float4(texCoord3d, 2.0f)))) + tex3d.SampleBias(_tex3d_sampler, texCoord3d, 1.0f)) + texCube.Sample(_texCube_sampler, texCoord3d)) + texCube.SampleLevel(_texCube_sampler, texCoord3d, 2.0f)) + texCube.SampleBias(_texCube_sampler, texCoord3d, 1.0f); + float2 _41 = float2(texCoord1d, 2.0f); + float3 _88 = float3(texCoord2d, 2.0f); + float4 _135 = float4(texCoord3d, 2.0f); + float4 _162 = (((((((((((((((((((tex1d.Sample(_tex1d_sampler, texCoord1d) + tex1d.Sample(_tex1d_sampler, texCoord1d, 1)) + tex1d.SampleLevel(_tex1d_sampler, texCoord1d, 2.0f)) + tex1d.SampleGrad(_tex1d_sampler, texCoord1d, 1.0f, 2.0f)) + tex1d.Sample(_tex1d_sampler, _41.x / _41.y)) + tex1d.SampleBias(_tex1d_sampler, texCoord1d, 1.0f)) + tex2d.Sample(_tex2d_sampler, texCoord2d)) + tex2d.Sample(_tex2d_sampler, texCoord2d, int2(1, 2))) + tex2d.SampleLevel(_tex2d_sampler, texCoord2d, 2.0f)) + tex2d.SampleGrad(_tex2d_sampler, texCoord2d, float2(1.0f, 2.0f), float2(3.0f, 4.0f))) + tex2d.Sample(_tex2d_sampler, _88.xy / _88.z)) + tex2d.SampleBias(_tex2d_sampler, texCoord2d, 1.0f)) + tex3d.Sample(_tex3d_sampler, texCoord3d)) + tex3d.Sample(_tex3d_sampler, texCoord3d, int3(1, 2, 3))) + tex3d.SampleLevel(_tex3d_sampler, texCoord3d, 2.0f)) + tex3d.SampleGrad(_tex3d_sampler, texCoord3d, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f))) + tex3d.Sample(_tex3d_sampler, _135.xyz / _135.w)) + tex3d.SampleBias(_tex3d_sampler, texCoord3d, 1.0f)) + texCube.Sample(_texCube_sampler, texCoord3d)) + texCube.SampleLevel(_texCube_sampler, texCoord3d, 2.0f)) + texCube.SampleBias(_texCube_sampler, texCoord3d, 1.0f); float4 _333 = _162; _333.w = ((_162.w + tex1dShadow.SampleCmp(_tex1dShadow_sampler, float3(texCoord1d, 0.0f, 0.0f).x, 0.0f)) + tex2dShadow.SampleCmp(_tex2dShadow_sampler, float3(texCoord2d, 0.0f).xy, 0.0f)) + texCubeShadow.SampleCmp(_texCubeShadow_sampler, float4(texCoord3d, 0.0f).xyz, 0.0f); float4 _308 = ((((((((((((((_333 + tex1dArray.Sample(_tex1dArray_sampler, texCoord2d)) + tex2dArray.Sample(_tex2dArray_sampler, texCoord3d)) + texCubeArray.Sample(_texCubeArray_sampler, texCoord4d)) + tex2d.GatherRed(_tex2d_sampler, texCoord2d)) + tex2d.GatherRed(_tex2d_sampler, texCoord2d)) + tex2d.GatherGreen(_tex2d_sampler, texCoord2d)) + tex2d.GatherBlue(_tex2d_sampler, texCoord2d)) + tex2d.GatherAlpha(_tex2d_sampler, texCoord2d)) + tex2d.GatherRed(_tex2d_sampler, texCoord2d, int2(1, 1))) + tex2d.GatherRed(_tex2d_sampler, texCoord2d, int2(1, 1))) + tex2d.GatherGreen(_tex2d_sampler, texCoord2d, int2(1, 1))) + tex2d.GatherBlue(_tex2d_sampler, texCoord2d, int2(1, 1))) + tex2d.GatherAlpha(_tex2d_sampler, texCoord2d, int2(1, 1))) + tex2d.Load(int3(int2(1, 2), 0))) + separateTex2d.Sample(samplerNonDepth, texCoord2d); diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/texture-proj-shadow.frag b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/texture-proj-shadow.frag index 4beaa1176..07e06008a 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/texture-proj-shadow.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/frag/texture-proj-shadow.frag @@ -26,32 +26,17 @@ struct SPIRV_Cross_Output float FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { float4 _20 = vClip4; _20.y = vClip4.w; - FragColor = uShadow1D.SampleCmp(_uShadow1D_sampler, SPIRV_Cross_projectTextureCoordinate(_20.xy), vClip4.z); + FragColor = uShadow1D.SampleCmp(_uShadow1D_sampler, _20.x / _20.y, vClip4.z / _20.y); float4 _30 = vClip4; _30.z = vClip4.w; - FragColor = uShadow2D.SampleCmp(_uShadow2D_sampler, SPIRV_Cross_projectTextureCoordinate(_30.xyz), vClip4.z); - FragColor = uSampler1D.Sample(_uSampler1D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip2)).x; - FragColor = uSampler2D.Sample(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip3)).x; - FragColor = uSampler3D.Sample(_uSampler3D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip4)).x; + FragColor = uShadow2D.SampleCmp(_uShadow2D_sampler, _30.xy / _30.z, vClip4.z / _30.z); + FragColor = uSampler1D.Sample(_uSampler1D_sampler, vClip2.x / vClip2.y).x; + FragColor = uSampler2D.Sample(_uSampler2D_sampler, vClip3.xy / vClip3.z).x; + FragColor = uSampler3D.Sample(_uSampler3D_sampler, vClip4.xyz / vClip4.w).x; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) diff --git a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/vert/basic.vert b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/vert/basic.vert index f357d907c..e0bcebf72 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-hlsl/vert/basic.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-hlsl/vert/basic.vert @@ -1,4 +1,4 @@ -cbuffer UBO +cbuffer UBO : register(b0) { row_major float4x4 _16_uMVP : packoffset(c0); }; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/comp/block-name-alias-global.asm.comp b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/comp/block-name-alias-global.asm.comp index 95f2717b4..e983acd92 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/comp/block-name-alias-global.asm.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/comp/block-name-alias-global.asm.comp @@ -22,7 +22,7 @@ struct A_2 struct A_3 { - A_2 Data[1024]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ A_2 Data[1024]; }; struct B @@ -32,7 +32,7 @@ struct B struct B_1 { - A_2 Data[1024]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ A_2 Data[1024]; }; kernel void main0(device B& C3 [[buffer(0)]], device A_1& C1 [[buffer(1)]], constant A_3& C2 [[buffer(2)]], constant B_1& C4 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..1bafc6953 --- /dev/null +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,24 @@ +#include +#include + +using namespace metal; + +constant float4 _20[2] = { float4(1.0, 2.0, 3.0, 4.0), float4(10.0) }; + +struct main0_out +{ + float4 FragColors_0 [[color(0)]]; + float4 FragColors_1 [[color(1)]]; + float4 FragColor [[color(2)]]; +}; + +fragment main0_out main0() +{ + main0_out out = {}; + float4 FragColors[2] = { float4(1.0, 2.0, 3.0, 4.0), float4(10.0) }; + out.FragColor = float4(5.0); + out.FragColors_0 = FragColors[0]; + out.FragColors_1 = FragColors[1]; + return out; +} + diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/unreachable.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/unreachable.asm.frag index 9a9baef57..918a0b9c1 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/unreachable.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/unreachable.asm.frag @@ -16,21 +16,21 @@ struct main0_in fragment main0_out main0(main0_in in [[stage_in]]) { main0_out out = {}; - bool _29; + float4 _33; for (;;) { - _29 = in.counter == 10; - if (_29) + if (in.counter == 10) { + _33 = float4(10.0); break; } else { + _33 = float4(30.0); break; } } - bool4 _35 = bool4(_29); - out.FragColor = float4(_35.x ? float4(10.0).x : float4(30.0).x, _35.y ? float4(10.0).y : float4(30.0).y, _35.z ? float4(10.0).z : float4(30.0).z, _35.w ? float4(10.0).w : float4(30.0).w); + out.FragColor = _33; return out; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag index d7d6ef634..989d82682 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag @@ -73,7 +73,7 @@ struct _18 float2 _m24; float2 _m25; float2 _m26; - char pad27[8]; + char _m27_pad[8]; packed_float3 _m27; float _m28; float _m29; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/atomic.comp b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/atomic.comp index 17d0a6528..f77922aca 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/atomic.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/atomic.comp @@ -40,6 +40,8 @@ kernel void main0(device SSBO& ssbo [[buffer(2)]]) { _52 = 10; } while (!atomic_compare_exchange_weak_explicit((volatile device atomic_int*)&ssbo.i32, &_52, 2, memory_order_relaxed, memory_order_relaxed)); + shared_u32 = 10u; + shared_i32 = 10; uint _57 = atomic_fetch_add_explicit((volatile threadgroup atomic_uint*)&shared_u32, 1u, memory_order_relaxed); uint _58 = atomic_fetch_or_explicit((volatile threadgroup atomic_uint*)&shared_u32, 1u, memory_order_relaxed); uint _59 = atomic_fetch_xor_explicit((volatile threadgroup atomic_uint*)&shared_u32, 1u, memory_order_relaxed); diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/bitcast-16bit-1.invalid.comp b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/bitcast-16bit-1.invalid.comp index 5671cd7cd..f91e5fea3 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/bitcast-16bit-1.invalid.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/bitcast-16bit-1.invalid.comp @@ -15,7 +15,7 @@ struct SSBO1 kernel void main0(device SSBO0& _25 [[buffer(0)]], device SSBO1& _39 [[buffer(1)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) { - _39.outputs[gl_GlobalInvocationID.x].x = int(as_type(as_type(_25.inputs[gl_GlobalInvocationID.x].xy) + half2(half(1)))); + _39.outputs[gl_GlobalInvocationID.x].x = int(as_type(as_type(_25.inputs[gl_GlobalInvocationID.x].xy) + half2(1.0h))); _39.outputs[gl_GlobalInvocationID.x].y = as_type(_25.inputs[gl_GlobalInvocationID.x].zw); _39.outputs[gl_GlobalInvocationID.x].z = int(as_type(ushort2(_25.inputs[gl_GlobalInvocationID.x].xy))); } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/spec-constant-op-member-array.comp b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/spec-constant-op-member-array.comp index 1d78f3f4f..d3c8b7dc4 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/spec-constant-op-member-array.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/spec-constant-op-member-array.comp @@ -28,14 +28,14 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif constant int c = SPIRV_CROSS_CONSTANT_ID_2; -constant int _18 = (c + 50); +constant int d = (c + 50); struct SSBO { A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; }; constant int e_tmp [[function_constant(3)]]; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/struct-packing.comp b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/struct-packing.comp index 468eb7e6e..bfaf4dd55 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/struct-packing.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/comp/struct-packing.comp @@ -43,7 +43,6 @@ struct Content S1 m1; S2 m2; S3 m3; - char pad7[4]; float m4; S4 m3s[8]; }; @@ -53,7 +52,6 @@ struct SSBO1 Content content; Content content1[2]; Content content2; - char pad3[8]; float2x2 m0; float2x2 m1; float2x3 m2[4]; @@ -61,9 +59,9 @@ struct SSBO1 float2x2 m4; float2x2 m5[9]; packed_float2x3 m6[4][2]; - char pad10[8]; + char _m10_pad[8]; float3x2 m7; - char pad11[8]; + char _m11_pad[8]; float array[1]; }; @@ -105,9 +103,9 @@ struct Content_1 S1_1 m1; S2_1 m2; S3_1 m3; - char pad7[4]; float m4; - S4_1 m3s[8]; + char _m8_pad[12]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ S4_1 m3s[8]; }; struct SSBO0 diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/shader-arithmetic-8bit.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/shader-arithmetic-8bit.frag new file mode 100644 index 000000000..6f1330c9e --- /dev/null +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/shader-arithmetic-8bit.frag @@ -0,0 +1,77 @@ +#include +#include + +using namespace metal; + +struct SSBO +{ + char i8[16]; + uchar u8[16]; +}; + +struct Push +{ + char i8; + uchar u8; +}; + +struct UBO +{ + char i8; + uchar u8; +}; + +struct main0_out +{ + int4 FragColorInt [[color(0)]]; + uint4 FragColorUint [[color(1)]]; +}; + +struct main0_in +{ + int4 vColor [[user(locn0)]]; +}; + +fragment main0_out main0(main0_in in [[stage_in]], constant Push& registers [[buffer(0)]], constant UBO& ubo [[buffer(1)]], device SSBO& ssbo [[buffer(2)]]) +{ + main0_out out = {}; + short _196 = 10; + int _197 = 20; + char2 _198 = as_type(_196); + char4 _199 = as_type(_197); + _196 = as_type(_198); + _197 = as_type(_199); + ssbo.i8[0] = _199.x; + ssbo.i8[1] = _199.y; + ssbo.i8[2] = _199.z; + ssbo.i8[3] = _199.w; + ushort _220 = 10u; + uint _221 = 20u; + uchar2 _222 = as_type(_220); + uchar4 _223 = as_type(_221); + _220 = as_type(_222); + _221 = as_type(_223); + ssbo.u8[0] = _223.x; + ssbo.u8[1] = _223.y; + ssbo.u8[2] = _223.z; + ssbo.u8[3] = _223.w; + char4 _246 = char4(in.vColor); + char4 _244 = _246; + _244 += char4(registers.i8); + _244 += char4(-40); + _244 += char4(-50); + _244 += char4(char(10), char(20), char(30), char(40)); + _244 += char4(ssbo.i8[4]); + _244 += char4(ubo.i8); + out.FragColorInt = int4(_244); + uchar4 _271 = uchar4(_246); + _271 += uchar4(registers.u8); + _271 += uchar4(216); + _271 += uchar4(206); + _271 += uchar4(uchar(10), uchar(20), uchar(30), uchar(40)); + _271 += uchar4(ssbo.u8[4]); + _271 += uchar4(ubo.u8); + out.FragColorUint = uint4(_271); + return out; +} + diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/spec-constant-ternary.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/spec-constant-ternary.frag index 5ab6b4fcb..059006509 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/spec-constant-ternary.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/spec-constant-ternary.frag @@ -6,7 +6,7 @@ using namespace metal; constant uint s_tmp [[function_constant(0)]]; constant uint s = is_function_constant_defined(s_tmp) ? s_tmp : 10u; constant bool _13 = (s > 20u); -constant uint _16 = _13 ? 30u : 50u; +constant uint f = _13 ? 30u : 50u; struct main0_out { @@ -16,7 +16,7 @@ struct main0_out fragment main0_out main0() { main0_out out = {}; - out.FragColor = float(_16); + out.FragColor = float(f); return out; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/texture-proj-shadow.frag b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/texture-proj-shadow.frag index c5ab0ee00..2e315ff0f 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/texture-proj-shadow.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/frag/texture-proj-shadow.frag @@ -20,7 +20,7 @@ fragment main0_out main0(main0_in in [[stage_in]], depth2d uShadow2D [[te main0_out out = {}; float4 _20 = in.vClip4; _20.z = in.vClip4.w; - out.FragColor = uShadow2D.sample_compare(uShadow2DSmplr, _20.xy / _20.z, in.vClip4.z); + out.FragColor = uShadow2D.sample_compare(uShadow2DSmplr, _20.xy / _20.z, in.vClip4.z / _20.z); out.FragColor = uSampler1D.sample(uSampler1DSmplr, in.vClip2.x / in.vClip2.y).x; out.FragColor = uSampler2D.sample(uSampler2DSmplr, in.vClip3.xy / in.vClip3.z).x; out.FragColor = uSampler3D.sample(uSampler3DSmplr, in.vClip4.xyz / in.vClip4.w).x; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/no_stage_out.write_buff.vert b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/no_stage_out.write_buff.vert index 458e1f1b7..52af329a8 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/no_stage_out.write_buff.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/no_stage_out.write_buff.vert @@ -27,10 +27,10 @@ vertex void main0(main0_in in [[stage_in]], constant _40& _42 [[buffer(0)]], dev { main0_out out = {}; out.gl_Position = in.m_17; - for (int _51 = 0; _51 < 1024; ) + for (int _52 = 0; _52 < 1024; ) { - _37._m0[_51] = _42._m0[_51]; - _51++; + _37._m0[_52] = _42._m0[_52]; + _52++; continue; } } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/packed_matrix.vert b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/packed_matrix.vert index 7f058061c..d319839c4 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/packed_matrix.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/packed_matrix.vert @@ -16,7 +16,7 @@ struct _42 float4x4 _m0; float4x4 _m1; float _m2; - char pad3[12]; + char _m3_pad[12]; packed_float3 _m3; float _m4; packed_float3 _m5; diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays-leaf.ios.vert b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays-leaf.ios.vert index 93704af28..7c454c1fc 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays-leaf.ios.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays-leaf.ios.vert @@ -20,14 +20,8 @@ struct constant_block #endif constant int arraySize = SPIRV_CROSS_CONSTANT_ID_0; -vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_block* storage_1 [[buffer(1)]], constant constant_block* constants_0 [[buffer(2)]], constant constant_block* constants_1 [[buffer(3)]], constant constant_block* constants_2 [[buffer(4)]], constant constant_block* constants_3 [[buffer(5)]], array, 3> images [[texture(0)]]) +vertex void main0(constant constant_block* constants_0 [[buffer(4)]], constant constant_block* constants_1 [[buffer(5)]], constant constant_block* constants_2 [[buffer(6)]], constant constant_block* constants_3 [[buffer(7)]], device storage_block* storage_0 [[buffer(8)]], device storage_block* storage_1 [[buffer(9)]], array, 3> images [[texture(0)]]) { - device storage_block* storage[] = - { - storage_0, - storage_1, - }; - constant constant_block* constants[] = { constants_0, @@ -35,7 +29,13 @@ vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_ constants_2, constants_3, }; - + + device storage_block* storage[] = + { + storage_0, + storage_1, + }; + storage[0]->baz = uint4(constants[3]->foo); storage[1]->quux = images[2].read(uint2(int2(constants[1]->bar))).xy; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays.ios.vert b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays.ios.vert index 93704af28..7c454c1fc 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays.ios.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/resource-arrays.ios.vert @@ -20,14 +20,8 @@ struct constant_block #endif constant int arraySize = SPIRV_CROSS_CONSTANT_ID_0; -vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_block* storage_1 [[buffer(1)]], constant constant_block* constants_0 [[buffer(2)]], constant constant_block* constants_1 [[buffer(3)]], constant constant_block* constants_2 [[buffer(4)]], constant constant_block* constants_3 [[buffer(5)]], array, 3> images [[texture(0)]]) +vertex void main0(constant constant_block* constants_0 [[buffer(4)]], constant constant_block* constants_1 [[buffer(5)]], constant constant_block* constants_2 [[buffer(6)]], constant constant_block* constants_3 [[buffer(7)]], device storage_block* storage_0 [[buffer(8)]], device storage_block* storage_1 [[buffer(9)]], array, 3> images [[texture(0)]]) { - device storage_block* storage[] = - { - storage_0, - storage_1, - }; - constant constant_block* constants[] = { constants_0, @@ -35,7 +29,13 @@ vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_ constants_2, constants_3, }; - + + device storage_block* storage[] = + { + storage_0, + storage_1, + }; + storage[0]->baz = uint4(constants[3]->foo); storage[1]->quux = images[2].read(uint2(int2(constants[1]->bar))).xy; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/ubo.alignment.vert b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/ubo.alignment.vert index 9a7ea56c6..c48111ed6 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/ubo.alignment.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders-msl/vert/ubo.alignment.vert @@ -7,7 +7,7 @@ struct UBO { float4x4 mvp; float2 targSize; - char pad2[8]; + char _m2_pad[8]; packed_float3 color; float opacity; }; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/asm/comp/hlsl-functionality.asm.comp b/3rdparty/spirv-cross/reference/opt/shaders/asm/comp/hlsl-functionality.asm.comp index 29bc02c69..6860cfafe 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/asm/comp/hlsl-functionality.asm.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders/asm/comp/hlsl-functionality.asm.comp @@ -6,7 +6,7 @@ layout(binding = 0, std430) buffer Buf vec4 _data[]; } Buf_1; -layout(std430) buffer Buf_count +layout(binding = 1, std430) buffer Buf_count { int _count; } Buf_count_1; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag index af44e6547..8c35e62ec 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/loop-body-dominator-continue-access.asm.frag @@ -14,17 +14,16 @@ int _240; void main() { - bool _246; uint _227; - int _237; + int _236; for (;;) { _227 = 0u; - bool _164; + bool _231; + int _237; for (;;) { - _164 = _227 < _11.shadowCascadesNum; - if (_164) + if (_227 < _11.shadowCascadesNum) { mat4 _228; for (;;) @@ -44,6 +43,7 @@ void main() if ((((_179 >= 0.0) && (_179 <= 1.0)) && (max(_186, _188) <= 1.0)) && (min(_186, _188) >= 0.0)) { _237 = int(_227); + _231 = true; break; } else @@ -57,16 +57,18 @@ void main() else { _237 = _240; + _231 = false; break; } } - _246 = _164 ? true : false; - if (_246) + if (_231) { + _236 = _237; break; } + _236 = -1; break; } - _entryPointOutput = _246 ? _237 : (-1); + _entryPointOutput = _236; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..229358757 --- /dev/null +++ b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,11 @@ +#version 450 + +layout(location = 0) out vec4 FragColors[2]; +layout(location = 2) out vec4 FragColor; + +void main() +{ + FragColors = vec4[](vec4(1.0, 2.0, 3.0, 4.0), vec4(10.0)); + FragColor = vec4(5.0); +} + diff --git a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/temporary-phi-hoisting.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/temporary-phi-hoisting.asm.frag index 1ecd61d74..ade51d4a8 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/temporary-phi-hoisting.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/temporary-phi-hoisting.asm.frag @@ -5,7 +5,7 @@ struct MyStruct vec4 color; }; -layout(std140) uniform MyStruct_CB +layout(binding = 0, std140) uniform MyStruct_CB { MyStruct g_MyStruct[4]; } _6; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/unreachable.asm.frag b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/unreachable.asm.frag index eb7e8a912..c8986c121 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/unreachable.asm.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/asm/frag/unreachable.asm.frag @@ -5,19 +5,20 @@ layout(location = 0) out vec4 FragColor; void main() { - bool _29; + vec4 _33; for (;;) { - _29 = counter == 10; - if (_29) + if (counter == 10) { + _33 = vec4(10.0); break; } else { + _33 = vec4(30.0); break; } } - FragColor = mix(vec4(30.0), vec4(10.0), bvec4(_29)); + FragColor = _33; } diff --git a/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-1.invalid.comp b/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-1.invalid.comp index 7420586f0..a4014e893 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-1.invalid.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-1.invalid.comp @@ -3,15 +3,11 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif @@ -31,7 +27,7 @@ void main() { uint ident = gl_GlobalInvocationID.x; f16vec2 a = int16BitsToFloat16(_25.inputs[ident].xy); - _39.outputs[ident].x = int(packFloat2x16(a + f16vec2(float16_t(1), float16_t(1)))); + _39.outputs[ident].x = int(packFloat2x16(a + f16vec2(1.0hf))); _39.outputs[ident].y = packInt2x16(_25.inputs[ident].zw); _39.outputs[ident].z = int(packUint2x16(u16vec2(_25.inputs[ident].xy))); } diff --git a/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-2.invalid.comp b/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-2.invalid.comp index 416bc4a2e..bddc16d62 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-2.invalid.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders/comp/bitcast-16bit-2.invalid.comp @@ -1,8 +1,6 @@ #version 450 #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif @@ -10,8 +8,6 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/frag/fp16.invalid.desktop.frag b/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/frag/fp16.invalid.desktop.frag index af8882c43..e1fc045c4 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/frag/fp16.invalid.desktop.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/frag/fp16.invalid.desktop.frag @@ -3,8 +3,6 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/vert/basic.desktop.sso.vert b/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/vert/basic.desktop.sso.vert index 5f527e08c..2f880398e 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/vert/basic.desktop.sso.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders/desktop-only/vert/basic.desktop.sso.vert @@ -5,7 +5,7 @@ out gl_PerVertex vec4 gl_Position; }; -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { mat4 uMVP; } _16; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/frag/16bit-constants.frag b/3rdparty/spirv-cross/reference/opt/shaders/frag/16bit-constants.frag index 48fbad97a..f9ce356fd 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/frag/16bit-constants.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/frag/16bit-constants.frag @@ -3,15 +3,11 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif diff --git a/3rdparty/spirv-cross/reference/opt/shaders/tesc/water_tess.tesc b/3rdparty/spirv-cross/reference/opt/shaders/tesc/water_tess.tesc index 69307d3c9..eb3e84d53 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/tesc/water_tess.tesc +++ b/3rdparty/spirv-cross/reference/opt/shaders/tesc/water_tess.tesc @@ -2,7 +2,7 @@ #extension GL_EXT_tessellation_shader : require layout(vertices = 1) out; -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { vec4 uScale; vec3 uCamPos; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vert/basic.vert b/3rdparty/spirv-cross/reference/opt/shaders/vert/basic.vert index 05504eb2f..8f251cbed 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vert/basic.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders/vert/basic.vert @@ -1,6 +1,6 @@ #version 310 es -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { mat4 uMVP; } _16; diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp index 33647a423..7c4c7ed6f 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp @@ -26,7 +26,7 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif const int c = SPIRV_CROSS_CONSTANT_ID_2; -const int _18 = (c + 50); +const int d = (c + 50); #ifndef SPIRV_CROSS_CONSTANT_ID_3 #define SPIRV_CROSS_CONSTANT_ID_3 400 #endif @@ -37,7 +37,7 @@ layout(binding = 0, std430) buffer SSBO A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; } _22; void main() diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk index cd68e93d7..b7571b7ab 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk @@ -17,7 +17,7 @@ struct B }; layout(constant_id = 2) const int c = 300; -const int _18 = (c + 50); +const int d = (c + 50); layout(constant_id = 3) const int e = 400; layout(set = 1, binding = 0, std430) buffer SSBO @@ -25,7 +25,7 @@ layout(set = 1, binding = 0, std430) buffer SSBO A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; } _22; void main() diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk new file mode 100644 index 000000000..d09930f3a --- /dev/null +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk @@ -0,0 +1,69 @@ +#version 450 +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require +#extension GL_EXT_shader_16bit_storage : require +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require +#extension GL_EXT_shader_8bit_storage : require + +layout(set = 0, binding = 1, std430) buffer SSBO +{ + int8_t i8[16]; + uint8_t u8[16]; +} ssbo; + +layout(set = 0, binding = 0, std140) uniform UBO +{ + int8_t i8; + uint8_t u8; +} ubo; + +layout(push_constant, std430) uniform Push +{ + int8_t i8; + uint8_t u8; +} registers; + +layout(location = 0) flat in ivec4 vColor; +layout(location = 0) out ivec4 FragColorInt; +layout(location = 1) out uvec4 FragColorUint; + +void main() +{ + int16_t _196 = 10s; + int _197 = 20; + i8vec2 _198 = unpack8(_196); + i8vec4 _199 = unpack8(_197); + _196 = pack16(_198); + _197 = pack32(_199); + ssbo.i8[0] = _199.x; + ssbo.i8[1] = _199.y; + ssbo.i8[2] = _199.z; + ssbo.i8[3] = _199.w; + uint16_t _220 = 10us; + uint _221 = 20u; + u8vec2 _222 = unpack8(_220); + u8vec4 _223 = unpack8(_221); + _220 = pack16(_222); + _221 = pack32(_223); + ssbo.u8[0] = _223.x; + ssbo.u8[1] = _223.y; + ssbo.u8[2] = _223.z; + ssbo.u8[3] = _223.w; + i8vec4 _246 = i8vec4(vColor); + i8vec4 _244 = _246; + _244 += i8vec4(registers.i8); + _244 += i8vec4(-40); + _244 += i8vec4(-50); + _244 += i8vec4(int8_t(10), int8_t(20), int8_t(30), int8_t(40)); + _244 += i8vec4(ssbo.i8[4]); + _244 += i8vec4(ubo.i8); + FragColorInt = ivec4(_244); + u8vec4 _271 = u8vec4(_246); + _271 += u8vec4(registers.u8); + _271 += u8vec4(216); + _271 += u8vec4(206); + _271 += u8vec4(uint8_t(10), uint8_t(20), uint8_t(30), uint8_t(40)); + _271 += u8vec4(ssbo.u8[4]); + _271 += u8vec4(ubo.u8); + FragColorUint = uvec4(_271); +} + diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag index e03dfcb9a..081206f1c 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag @@ -5,12 +5,12 @@ #endif const uint s = SPIRV_CROSS_CONSTANT_ID_0; const bool _13 = (s > 20u); -const uint _16 = _13 ? 30u : 50u; +const uint f = _13 ? 30u : 50u; layout(location = 0) out float FragColor; void main() { - FragColor = float(_16); + FragColor = float(f); } diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk index 59d3b99b9..34bfea026 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk @@ -2,12 +2,12 @@ layout(constant_id = 0) const uint s = 10u; const bool _13 = (s > 20u); -const uint _16 = _13 ? 30u : 50u; +const uint f = _13 ? 30u : 50u; layout(location = 0) out float FragColor; void main() { - FragColor = float(_16); + FragColor = float(f); } diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert index 2ade81104..b3aafc8d8 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert @@ -1,18 +1,14 @@ #version 450 #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif -#extension GL_EXT_shader_8bit_storage : require +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require #if defined(GL_AMD_gpu_shader_half_float) #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert.vk b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert.vk index c283d6064..caec60a2c 100644 --- a/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert.vk +++ b/3rdparty/spirv-cross/reference/opt/shaders/vulkan/vert/small-storage.vk.vert.vk @@ -1,16 +1,12 @@ #version 450 -#if defined(GL_AMD_gpu_shader_int16) -#extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require #extension GL_EXT_shader_16bit_storage : require -#else -#error No extension available for Int16. -#endif +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require #extension GL_EXT_shader_8bit_storage : require #if defined(GL_AMD_gpu_shader_half_float) #extension GL_AMD_gpu_shader_half_float : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require +#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16) +#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..1905b5ea2 --- /dev/null +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,23 @@ +static const float4 _20[2] = { float4(1.0f, 2.0f, 3.0f, 4.0f), 10.0f.xxxx }; + +static float4 FragColors[2] = _20; +static float4 FragColor = 5.0f.xxxx; + +struct SPIRV_Cross_Output +{ + float4 FragColors[2] : SV_Target0; + float4 FragColor : SV_Target2; +}; + +void frag_main() +{ +} + +SPIRV_Cross_Output main() +{ + frag_main(); + SPIRV_Cross_Output stage_output; + stage_output.FragColors = FragColors; + stage_output.FragColor = FragColor; + return stage_output; +} diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert b/3rdparty/spirv-cross/reference/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert index 8d5e771fe..48b2df20d 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert @@ -1,10 +1,10 @@ static float4 gl_Position; -static int gl_VertexID; -static int gl_InstanceID; +static int gl_VertexIndex; +static int gl_InstanceIndex; struct SPIRV_Cross_Input { - uint gl_VertexID : SV_VertexID; - uint gl_InstanceID : SV_InstanceID; + uint gl_VertexIndex : SV_VertexID; + uint gl_InstanceIndex : SV_InstanceID; }; struct SPIRV_Cross_Output @@ -14,13 +14,13 @@ struct SPIRV_Cross_Output void vert_main() { - gl_Position = float(gl_VertexID + gl_InstanceID).xxxx; + gl_Position = float(gl_VertexIndex + gl_InstanceIndex).xxxx; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) { - gl_VertexID = int(stage_input.gl_VertexID); - gl_InstanceID = int(stage_input.gl_InstanceID); + gl_VertexIndex = int(stage_input.gl_VertexIndex); + gl_InstanceIndex = int(stage_input.gl_InstanceIndex); vert_main(); SPIRV_Cross_Output stage_output; stage_output.gl_Position = gl_Position; diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/comp/spec-constant-op-member-array.comp b/3rdparty/spirv-cross/reference/shaders-hlsl/comp/spec-constant-op-member-array.comp index c35031b84..c4537db03 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/comp/spec-constant-op-member-array.comp +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/comp/spec-constant-op-member-array.comp @@ -23,7 +23,7 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif static const int c = SPIRV_CROSS_CONSTANT_ID_2; -static const int _18 = (c + 50); +static const int d = (c + 50); #ifndef SPIRV_CROSS_CONSTANT_ID_3 #define SPIRV_CROSS_CONSTANT_ID_3 400 #endif diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/sample-cmp-level-zero.frag b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/sample-cmp-level-zero.frag index b52b1df55..b6df0019a 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/sample-cmp-level-zero.frag +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/sample-cmp-level-zero.frag @@ -22,21 +22,6 @@ struct SPIRV_Cross_Output float FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { float s0 = uSampler2D.SampleCmp(_uSampler2D_sampler, vUVRef.xy, vUVRef.z, int2(-1, -1)); @@ -48,10 +33,10 @@ void frag_main() float l2 = uSamplerCube.SampleCmpLevelZero(_uSamplerCube_sampler, vDirRef.xyz, vDirRef.w); float4 _80 = vDirRef; _80.z = vDirRef.w; - float p0 = uSampler2D.SampleCmp(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(_80.xyz), vDirRef.z, int2(1, 1)); + float p0 = uSampler2D.SampleCmp(_uSampler2D_sampler, _80.xy / _80.z, vDirRef.z / _80.z, int2(1, 1)); float4 _87 = vDirRef; _87.z = vDirRef.w; - float p1 = uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(_87.xyz), vDirRef.z, int2(1, 1)); + float p1 = uSampler2D.SampleCmpLevelZero(_uSampler2D_sampler, _87.xy / _87.z, vDirRef.z / _87.z, int2(1, 1)); FragColor = (((((((s0 + s1) + s2) + s3) + l0) + l1) + l2) + p0) + p1; } diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/spec-constant-ternary.frag b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/spec-constant-ternary.frag index 58735aad0..942da54f0 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/spec-constant-ternary.frag +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/spec-constant-ternary.frag @@ -3,7 +3,7 @@ #endif static const uint s = SPIRV_CROSS_CONSTANT_ID_0; static const bool _13 = (s > 20u); -static const uint _16 = _13 ? 30u : 50u; +static const uint f = _13 ? 30u : 50u; static float FragColor; @@ -14,7 +14,7 @@ struct SPIRV_Cross_Output void frag_main() { - FragColor = float(_16); + FragColor = float(f); } SPIRV_Cross_Output main() diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/tex-sampling.frag b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/tex-sampling.frag index 7fa60957d..583217511 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/tex-sampling.frag +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/tex-sampling.frag @@ -42,40 +42,28 @@ struct SPIRV_Cross_Output float4 FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { float4 texcolor = tex1d.Sample(_tex1d_sampler, texCoord1d); texcolor += tex1d.Sample(_tex1d_sampler, texCoord1d, 1); texcolor += tex1d.SampleLevel(_tex1d_sampler, texCoord1d, 2.0f); texcolor += tex1d.SampleGrad(_tex1d_sampler, texCoord1d, 1.0f, 2.0f); - texcolor += tex1d.Sample(_tex1d_sampler, SPIRV_Cross_projectTextureCoordinate(float2(texCoord1d, 2.0f))); + float2 _41 = float2(texCoord1d, 2.0f); + texcolor += tex1d.Sample(_tex1d_sampler, _41.x / _41.y); texcolor += tex1d.SampleBias(_tex1d_sampler, texCoord1d, 1.0f); texcolor += tex2d.Sample(_tex2d_sampler, texCoord2d); texcolor += tex2d.Sample(_tex2d_sampler, texCoord2d, int2(1, 2)); texcolor += tex2d.SampleLevel(_tex2d_sampler, texCoord2d, 2.0f); texcolor += tex2d.SampleGrad(_tex2d_sampler, texCoord2d, float2(1.0f, 2.0f), float2(3.0f, 4.0f)); - texcolor += tex2d.Sample(_tex2d_sampler, SPIRV_Cross_projectTextureCoordinate(float3(texCoord2d, 2.0f))); + float3 _88 = float3(texCoord2d, 2.0f); + texcolor += tex2d.Sample(_tex2d_sampler, _88.xy / _88.z); texcolor += tex2d.SampleBias(_tex2d_sampler, texCoord2d, 1.0f); texcolor += tex3d.Sample(_tex3d_sampler, texCoord3d); texcolor += tex3d.Sample(_tex3d_sampler, texCoord3d, int3(1, 2, 3)); texcolor += tex3d.SampleLevel(_tex3d_sampler, texCoord3d, 2.0f); texcolor += tex3d.SampleGrad(_tex3d_sampler, texCoord3d, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f)); - texcolor += tex3d.Sample(_tex3d_sampler, SPIRV_Cross_projectTextureCoordinate(float4(texCoord3d, 2.0f))); + float4 _135 = float4(texCoord3d, 2.0f); + texcolor += tex3d.Sample(_tex3d_sampler, _135.xyz / _135.w); texcolor += tex3d.SampleBias(_tex3d_sampler, texCoord3d, 1.0f); texcolor += texCube.Sample(_texCube_sampler, texCoord3d); texcolor += texCube.SampleLevel(_texCube_sampler, texCoord3d, 2.0f); diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/texture-proj-shadow.frag b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/texture-proj-shadow.frag index 4beaa1176..07e06008a 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/frag/texture-proj-shadow.frag +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/frag/texture-proj-shadow.frag @@ -26,32 +26,17 @@ struct SPIRV_Cross_Output float FragColor : SV_Target0; }; -float SPIRV_Cross_projectTextureCoordinate(float2 coord) -{ - return coord.x / coord.y; -} - -float2 SPIRV_Cross_projectTextureCoordinate(float3 coord) -{ - return float2(coord.x, coord.y) / coord.z; -} - -float3 SPIRV_Cross_projectTextureCoordinate(float4 coord) -{ - return float3(coord.x, coord.y, coord.z) / coord.w; -} - void frag_main() { float4 _20 = vClip4; _20.y = vClip4.w; - FragColor = uShadow1D.SampleCmp(_uShadow1D_sampler, SPIRV_Cross_projectTextureCoordinate(_20.xy), vClip4.z); + FragColor = uShadow1D.SampleCmp(_uShadow1D_sampler, _20.x / _20.y, vClip4.z / _20.y); float4 _30 = vClip4; _30.z = vClip4.w; - FragColor = uShadow2D.SampleCmp(_uShadow2D_sampler, SPIRV_Cross_projectTextureCoordinate(_30.xyz), vClip4.z); - FragColor = uSampler1D.Sample(_uSampler1D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip2)).x; - FragColor = uSampler2D.Sample(_uSampler2D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip3)).x; - FragColor = uSampler3D.Sample(_uSampler3D_sampler, SPIRV_Cross_projectTextureCoordinate(vClip4)).x; + FragColor = uShadow2D.SampleCmp(_uShadow2D_sampler, _30.xy / _30.z, vClip4.z / _30.z); + FragColor = uSampler1D.Sample(_uSampler1D_sampler, vClip2.x / vClip2.y).x; + FragColor = uSampler2D.Sample(_uSampler2D_sampler, vClip3.xy / vClip3.z).x; + FragColor = uSampler3D.Sample(_uSampler3D_sampler, vClip4.xyz / vClip4.w).x; } SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input) diff --git a/3rdparty/spirv-cross/reference/shaders-hlsl/vert/basic.vert b/3rdparty/spirv-cross/reference/shaders-hlsl/vert/basic.vert index f357d907c..e0bcebf72 100644 --- a/3rdparty/spirv-cross/reference/shaders-hlsl/vert/basic.vert +++ b/3rdparty/spirv-cross/reference/shaders-hlsl/vert/basic.vert @@ -1,4 +1,4 @@ -cbuffer UBO +cbuffer UBO : register(b0) { row_major float4x4 _16_uMVP : packoffset(c0); }; diff --git a/3rdparty/spirv-cross/reference/shaders-msl-no-opt/asm/frag/texture-access.swizzle.asm.frag b/3rdparty/spirv-cross/reference/shaders-msl-no-opt/asm/frag/texture-access.swizzle.asm.frag index d56bef8b2..577434a01 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl-no-opt/asm/frag/texture-access.swizzle.asm.frag +++ b/3rdparty/spirv-cross/reference/shaders-msl-no-opt/asm/frag/texture-access.swizzle.asm.frag @@ -163,7 +163,7 @@ fragment void main0(constant spvAux& spvAuxBuffer [[buffer(0)]], texture1d tex1d, thread const sampler tex1dSmplr, c = spvTextureSwizzle(tex3d.sample(tex3dSmplr, float4(0.0, 0.0, 0.0, 1.0).xyz / float4(0.0, 0.0, 0.0, 1.0).w), tex3dSwzl); float4 _103 = float4(0.0, 0.0, 1.0, 1.0); _103.z = float4(0.0, 0.0, 1.0, 1.0).w; - c.x = spvTextureSwizzle(depth2d.sample_compare(depth2dSmplr, _103.xy / _103.z, float4(0.0, 0.0, 1.0, 1.0).z), depth2dSwzl); + c.x = spvTextureSwizzle(depth2d.sample_compare(depth2dSmplr, _103.xy / _103.z, float4(0.0, 0.0, 1.0, 1.0).z / _103.z), depth2dSwzl); c = spvTextureSwizzle(tex1d.sample(tex1dSmplr, 0.0), tex1dSwzl); c = spvTextureSwizzle(tex2d.sample(tex2dSmplr, float2(0.0), level(0.0)), tex2dSwzl); c = spvTextureSwizzle(tex3d.sample(tex3dSmplr, float3(0.0), level(0.0)), tex3dSwzl); @@ -166,7 +166,7 @@ float4 doSwizzle(thread texture1d tex1d, thread const sampler tex1dSmplr, c = spvTextureSwizzle(tex3d.sample(tex3dSmplr, float4(0.0, 0.0, 0.0, 1.0).xyz / float4(0.0, 0.0, 0.0, 1.0).w, level(0.0)), tex3dSwzl); float4 _131 = float4(0.0, 0.0, 1.0, 1.0); _131.z = float4(0.0, 0.0, 1.0, 1.0).w; - c.x = spvTextureSwizzle(depth2d.sample_compare(depth2dSmplr, _131.xy / _131.z, float4(0.0, 0.0, 1.0, 1.0).z, level(0.0)), depth2dSwzl); + c.x = spvTextureSwizzle(depth2d.sample_compare(depth2dSmplr, _131.xy / _131.z, float4(0.0, 0.0, 1.0, 1.0).z / _131.z, level(0.0)), depth2dSwzl); c = spvTextureSwizzle(tex1d.read(uint(0)), tex1dSwzl); c = spvTextureSwizzle(tex2d.read(uint2(int2(0)), 0), tex2dSwzl); c = spvTextureSwizzle(tex3d.read(uint3(int3(0)), 0), tex3dSwzl); diff --git a/3rdparty/spirv-cross/reference/shaders-msl-no-opt/frag/texture-access.swizzle.frag b/3rdparty/spirv-cross/reference/shaders-msl-no-opt/frag/texture-access.swizzle.frag index 9d1abcaec..62c55bdac 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl-no-opt/frag/texture-access.swizzle.frag +++ b/3rdparty/spirv-cross/reference/shaders-msl-no-opt/frag/texture-access.swizzle.frag @@ -163,7 +163,7 @@ fragment void main0(constant spvAux& spvAuxBuffer [[buffer(0)]], texture1d t1, thread const sampler t1Smplr c = spvTextureSwizzle(t3.sample(t3Smplr, float4(0.0, 0.0, 0.0, 1.0).xyz / float4(0.0, 0.0, 0.0, 1.0).w), t3Swzl); float4 _119 = float4(0.0, 0.0, 1.0, 1.0); _119.z = float4(0.0, 0.0, 1.0, 1.0).w; - c.x = spvTextureSwizzle(d2.sample_compare(d2Smplr, _119.xy / _119.z, float4(0.0, 0.0, 1.0, 1.0).z), d2Swzl); + c.x = spvTextureSwizzle(d2.sample_compare(d2Smplr, _119.xy / _119.z, float4(0.0, 0.0, 1.0, 1.0).z / _119.z), d2Swzl); c = spvTextureSwizzle(t1.sample(t1Smplr, 0.0), t1Swzl); c = spvTextureSwizzle(t2.sample(defaultSampler, float2(0.0), level(0.0)), t2Swzl); c = spvTextureSwizzle(t3.sample(t3Smplr, float3(0.0), level(0.0)), t3Swzl); @@ -171,7 +171,7 @@ float4 do_samples(thread const texture1d t1, thread const sampler t1Smplr c = spvTextureSwizzle(t3.sample(t3Smplr, float4(0.0, 0.0, 0.0, 1.0).xyz / float4(0.0, 0.0, 0.0, 1.0).w, level(0.0)), t3Swzl); float4 _153 = float4(0.0, 0.0, 1.0, 1.0); _153.z = float4(0.0, 0.0, 1.0, 1.0).w; - c.x = spvTextureSwizzle(d2.sample_compare(d2Smplr, _153.xy / _153.z, float4(0.0, 0.0, 1.0, 1.0).z, level(0.0)), d2Swzl); + c.x = spvTextureSwizzle(d2.sample_compare(d2Smplr, _153.xy / _153.z, float4(0.0, 0.0, 1.0, 1.0).z / _153.z, level(0.0)), d2Swzl); c = spvTextureSwizzle(t1.read(uint(0)), t1Swzl); c = spvTextureSwizzle(t2.read(uint2(int2(0)), 0), t2Swzl); c = spvTextureSwizzle(t3.read(uint3(int3(0)), 0), t3Swzl); diff --git a/3rdparty/spirv-cross/reference/shaders-msl/asm/comp/block-name-alias-global.asm.comp b/3rdparty/spirv-cross/reference/shaders-msl/asm/comp/block-name-alias-global.asm.comp index 95f2717b4..e983acd92 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/asm/comp/block-name-alias-global.asm.comp +++ b/3rdparty/spirv-cross/reference/shaders-msl/asm/comp/block-name-alias-global.asm.comp @@ -22,7 +22,7 @@ struct A_2 struct A_3 { - A_2 Data[1024]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ A_2 Data[1024]; }; struct B @@ -32,7 +32,7 @@ struct B struct B_1 { - A_2 Data[1024]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ A_2 Data[1024]; }; kernel void main0(device B& C3 [[buffer(0)]], device A_1& C1 [[buffer(1)]], constant A_3& C2 [[buffer(2)]], constant B_1& C4 [[buffer(3)]], uint3 gl_GlobalInvocationID [[thread_position_in_grid]]) diff --git a/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..1bafc6953 --- /dev/null +++ b/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,24 @@ +#include +#include + +using namespace metal; + +constant float4 _20[2] = { float4(1.0, 2.0, 3.0, 4.0), float4(10.0) }; + +struct main0_out +{ + float4 FragColors_0 [[color(0)]]; + float4 FragColors_1 [[color(1)]]; + float4 FragColor [[color(2)]]; +}; + +fragment main0_out main0() +{ + main0_out out = {}; + float4 FragColors[2] = { float4(1.0, 2.0, 3.0, 4.0), float4(10.0) }; + out.FragColor = float4(5.0); + out.FragColors_0 = FragColors[0]; + out.FragColors_1 = FragColors[1]; + return out; +} + diff --git a/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag b/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag index 74bd618c4..1738478dc 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag +++ b/3rdparty/spirv-cross/reference/shaders-msl/asm/frag/vector-shuffle-oom.asm.frag @@ -73,7 +73,7 @@ struct _18 float2 _m24; float2 _m25; float2 _m26; - char pad27[8]; + char _m27_pad[8]; packed_float3 _m27; float _m28; float _m29; diff --git a/3rdparty/spirv-cross/reference/shaders-msl/comp/bitcast-16bit-1.invalid.comp b/3rdparty/spirv-cross/reference/shaders-msl/comp/bitcast-16bit-1.invalid.comp index ddf38a602..8315f7927 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/comp/bitcast-16bit-1.invalid.comp +++ b/3rdparty/spirv-cross/reference/shaders-msl/comp/bitcast-16bit-1.invalid.comp @@ -17,7 +17,7 @@ kernel void main0(device SSBO0& _25 [[buffer(0)]], device SSBO1& _39 [[buffer(1) { uint ident = gl_GlobalInvocationID.x; half2 a = as_type(_25.inputs[ident].xy); - _39.outputs[ident].x = int(as_type(a + half2(half(1), half(1)))); + _39.outputs[ident].x = int(as_type(a + half2(1.0h))); _39.outputs[ident].y = as_type(_25.inputs[ident].zw); _39.outputs[ident].z = int(as_type(ushort2(_25.inputs[ident].xy))); } diff --git a/3rdparty/spirv-cross/reference/shaders-msl/comp/spec-constant-op-member-array.comp b/3rdparty/spirv-cross/reference/shaders-msl/comp/spec-constant-op-member-array.comp index 1d78f3f4f..d3c8b7dc4 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/comp/spec-constant-op-member-array.comp +++ b/3rdparty/spirv-cross/reference/shaders-msl/comp/spec-constant-op-member-array.comp @@ -28,14 +28,14 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif constant int c = SPIRV_CROSS_CONSTANT_ID_2; -constant int _18 = (c + 50); +constant int d = (c + 50); struct SSBO { A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; }; constant int e_tmp [[function_constant(3)]]; diff --git a/3rdparty/spirv-cross/reference/shaders-msl/comp/struct-packing.comp b/3rdparty/spirv-cross/reference/shaders-msl/comp/struct-packing.comp index 468eb7e6e..bfaf4dd55 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/comp/struct-packing.comp +++ b/3rdparty/spirv-cross/reference/shaders-msl/comp/struct-packing.comp @@ -43,7 +43,6 @@ struct Content S1 m1; S2 m2; S3 m3; - char pad7[4]; float m4; S4 m3s[8]; }; @@ -53,7 +52,6 @@ struct SSBO1 Content content; Content content1[2]; Content content2; - char pad3[8]; float2x2 m0; float2x2 m1; float2x3 m2[4]; @@ -61,9 +59,9 @@ struct SSBO1 float2x2 m4; float2x2 m5[9]; packed_float2x3 m6[4][2]; - char pad10[8]; + char _m10_pad[8]; float3x2 m7; - char pad11[8]; + char _m11_pad[8]; float array[1]; }; @@ -105,9 +103,9 @@ struct Content_1 S1_1 m1; S2_1 m2; S3_1 m3; - char pad7[4]; float m4; - S4_1 m3s[8]; + char _m8_pad[12]; + /* FIXME: A padded struct is needed here. If you see this message, file a bug! */ S4_1 m3s[8]; }; struct SSBO0 diff --git a/3rdparty/spirv-cross/reference/shaders-msl/frag/shader-arithmetic-8bit.frag b/3rdparty/spirv-cross/reference/shaders-msl/frag/shader-arithmetic-8bit.frag new file mode 100644 index 000000000..e480f0bf9 --- /dev/null +++ b/3rdparty/spirv-cross/reference/shaders-msl/frag/shader-arithmetic-8bit.frag @@ -0,0 +1,98 @@ +#pragma clang diagnostic ignored "-Wmissing-prototypes" + +#include +#include + +using namespace metal; + +struct SSBO +{ + char i8[16]; + uchar u8[16]; +}; + +struct Push +{ + char i8; + uchar u8; +}; + +struct UBO +{ + char i8; + uchar u8; +}; + +struct main0_out +{ + int4 FragColorInt [[color(0)]]; + uint4 FragColorUint [[color(1)]]; +}; + +struct main0_in +{ + int4 vColor [[user(locn0)]]; +}; + +void packing_int8(device SSBO& ssbo) +{ + short i16 = 10; + int i32 = 20; + char2 i8_2 = as_type(i16); + char4 i8_4 = as_type(i32); + i16 = as_type(i8_2); + i32 = as_type(i8_4); + ssbo.i8[0] = i8_4.x; + ssbo.i8[1] = i8_4.y; + ssbo.i8[2] = i8_4.z; + ssbo.i8[3] = i8_4.w; +} + +void packing_uint8(device SSBO& ssbo) +{ + ushort u16 = 10u; + uint u32 = 20u; + uchar2 u8_2 = as_type(u16); + uchar4 u8_4 = as_type(u32); + u16 = as_type(u8_2); + u32 = as_type(u8_4); + ssbo.u8[0] = u8_4.x; + ssbo.u8[1] = u8_4.y; + ssbo.u8[2] = u8_4.z; + ssbo.u8[3] = u8_4.w; +} + +void compute_int8(device SSBO& ssbo, thread int4& vColor, constant Push& registers, constant UBO& ubo, thread int4& FragColorInt) +{ + char4 tmp = char4(vColor); + tmp += char4(registers.i8); + tmp += char4(char(-40)); + tmp += char4(-50); + tmp += char4(char(10), char(20), char(30), char(40)); + tmp += char4(ssbo.i8[4]); + tmp += char4(ubo.i8); + FragColorInt = int4(tmp); +} + +void compute_uint8(device SSBO& ssbo, thread int4& vColor, constant Push& registers, constant UBO& ubo, thread uint4& FragColorUint) +{ + uchar4 tmp = uchar4(char4(vColor)); + tmp += uchar4(registers.u8); + tmp += uchar4(uchar(216)); + tmp += uchar4(206); + tmp += uchar4(uchar(10), uchar(20), uchar(30), uchar(40)); + tmp += uchar4(ssbo.u8[4]); + tmp += uchar4(ubo.u8); + FragColorUint = uint4(tmp); +} + +fragment main0_out main0(main0_in in [[stage_in]], constant Push& registers [[buffer(0)]], constant UBO& ubo [[buffer(1)]], device SSBO& ssbo [[buffer(2)]]) +{ + main0_out out = {}; + packing_int8(ssbo); + packing_uint8(ssbo); + compute_int8(ssbo, in.vColor, registers, ubo, out.FragColorInt); + compute_uint8(ssbo, in.vColor, registers, ubo, out.FragColorUint); + return out; +} + diff --git a/3rdparty/spirv-cross/reference/shaders-msl/frag/spec-constant-ternary.frag b/3rdparty/spirv-cross/reference/shaders-msl/frag/spec-constant-ternary.frag index 5ab6b4fcb..059006509 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/frag/spec-constant-ternary.frag +++ b/3rdparty/spirv-cross/reference/shaders-msl/frag/spec-constant-ternary.frag @@ -6,7 +6,7 @@ using namespace metal; constant uint s_tmp [[function_constant(0)]]; constant uint s = is_function_constant_defined(s_tmp) ? s_tmp : 10u; constant bool _13 = (s > 20u); -constant uint _16 = _13 ? 30u : 50u; +constant uint f = _13 ? 30u : 50u; struct main0_out { @@ -16,7 +16,7 @@ struct main0_out fragment main0_out main0() { main0_out out = {}; - out.FragColor = float(_16); + out.FragColor = float(f); return out; } diff --git a/3rdparty/spirv-cross/reference/shaders-msl/frag/texture-proj-shadow.frag b/3rdparty/spirv-cross/reference/shaders-msl/frag/texture-proj-shadow.frag index c5ab0ee00..2e315ff0f 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/frag/texture-proj-shadow.frag +++ b/3rdparty/spirv-cross/reference/shaders-msl/frag/texture-proj-shadow.frag @@ -20,7 +20,7 @@ fragment main0_out main0(main0_in in [[stage_in]], depth2d uShadow2D [[te main0_out out = {}; float4 _20 = in.vClip4; _20.z = in.vClip4.w; - out.FragColor = uShadow2D.sample_compare(uShadow2DSmplr, _20.xy / _20.z, in.vClip4.z); + out.FragColor = uShadow2D.sample_compare(uShadow2DSmplr, _20.xy / _20.z, in.vClip4.z / _20.z); out.FragColor = uSampler1D.sample(uSampler1DSmplr, in.vClip2.x / in.vClip2.y).x; out.FragColor = uSampler2D.sample(uSampler2DSmplr, in.vClip3.xy / in.vClip3.z).x; out.FragColor = uSampler3D.sample(uSampler3DSmplr, in.vClip4.xyz / in.vClip4.w).x; diff --git a/3rdparty/spirv-cross/reference/shaders-msl/vert/packed_matrix.vert b/3rdparty/spirv-cross/reference/shaders-msl/vert/packed_matrix.vert index 89638511d..98d4de532 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/vert/packed_matrix.vert +++ b/3rdparty/spirv-cross/reference/shaders-msl/vert/packed_matrix.vert @@ -16,7 +16,7 @@ struct _42 float4x4 _m0; float4x4 _m1; float _m2; - char pad3[12]; + char _m3_pad[12]; packed_float3 _m3; float _m4; packed_float3 _m5; diff --git a/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays-leaf.ios.vert b/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays-leaf.ios.vert index bef2acc88..5c2676306 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays-leaf.ios.vert +++ b/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays-leaf.ios.vert @@ -28,14 +28,8 @@ void doWork(device storage_block* (&storage)[2], constant constant_block* (&cons storage[1]->quux = images[2].read(uint2(int2(constants[1]->bar))).xy; } -vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_block* storage_1 [[buffer(1)]], constant constant_block* constants_0 [[buffer(2)]], constant constant_block* constants_1 [[buffer(3)]], constant constant_block* constants_2 [[buffer(4)]], constant constant_block* constants_3 [[buffer(5)]], array, 3> images [[texture(0)]]) +vertex void main0(constant constant_block* constants_0 [[buffer(4)]], constant constant_block* constants_1 [[buffer(5)]], constant constant_block* constants_2 [[buffer(6)]], constant constant_block* constants_3 [[buffer(7)]], device storage_block* storage_0 [[buffer(8)]], device storage_block* storage_1 [[buffer(9)]], array, 3> images [[texture(0)]]) { - device storage_block* storage[] = - { - storage_0, - storage_1, - }; - constant constant_block* constants[] = { constants_0, @@ -43,7 +37,13 @@ vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_ constants_2, constants_3, }; - + + device storage_block* storage[] = + { + storage_0, + storage_1, + }; + doWork(storage, constants, images); } diff --git a/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays.ios.vert b/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays.ios.vert index 93704af28..7c454c1fc 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays.ios.vert +++ b/3rdparty/spirv-cross/reference/shaders-msl/vert/resource-arrays.ios.vert @@ -20,14 +20,8 @@ struct constant_block #endif constant int arraySize = SPIRV_CROSS_CONSTANT_ID_0; -vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_block* storage_1 [[buffer(1)]], constant constant_block* constants_0 [[buffer(2)]], constant constant_block* constants_1 [[buffer(3)]], constant constant_block* constants_2 [[buffer(4)]], constant constant_block* constants_3 [[buffer(5)]], array, 3> images [[texture(0)]]) +vertex void main0(constant constant_block* constants_0 [[buffer(4)]], constant constant_block* constants_1 [[buffer(5)]], constant constant_block* constants_2 [[buffer(6)]], constant constant_block* constants_3 [[buffer(7)]], device storage_block* storage_0 [[buffer(8)]], device storage_block* storage_1 [[buffer(9)]], array, 3> images [[texture(0)]]) { - device storage_block* storage[] = - { - storage_0, - storage_1, - }; - constant constant_block* constants[] = { constants_0, @@ -35,7 +29,13 @@ vertex void main0(device storage_block* storage_0 [[buffer(0)]], device storage_ constants_2, constants_3, }; - + + device storage_block* storage[] = + { + storage_0, + storage_1, + }; + storage[0]->baz = uint4(constants[3]->foo); storage[1]->quux = images[2].read(uint2(int2(constants[1]->bar))).xy; } diff --git a/3rdparty/spirv-cross/reference/shaders-msl/vert/ubo.alignment.vert b/3rdparty/spirv-cross/reference/shaders-msl/vert/ubo.alignment.vert index 9a7ea56c6..c48111ed6 100644 --- a/3rdparty/spirv-cross/reference/shaders-msl/vert/ubo.alignment.vert +++ b/3rdparty/spirv-cross/reference/shaders-msl/vert/ubo.alignment.vert @@ -7,7 +7,7 @@ struct UBO { float4x4 mvp; float2 targSize; - char pad2[8]; + char _m2_pad[8]; packed_float3 color; float opacity; }; diff --git a/3rdparty/spirv-cross/reference/shaders/asm/comp/hlsl-functionality.asm.comp b/3rdparty/spirv-cross/reference/shaders/asm/comp/hlsl-functionality.asm.comp index ae3bb1f86..e80f52404 100644 --- a/3rdparty/spirv-cross/reference/shaders/asm/comp/hlsl-functionality.asm.comp +++ b/3rdparty/spirv-cross/reference/shaders/asm/comp/hlsl-functionality.asm.comp @@ -6,7 +6,7 @@ layout(binding = 0, std430) buffer Buf vec4 _data[]; } Buf_1; -layout(std430) buffer Buf_count +layout(binding = 1, std430) buffer Buf_count { int _count; } Buf_count_1; diff --git a/3rdparty/spirv-cross/reference/shaders/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/reference/shaders/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..229358757 --- /dev/null +++ b/3rdparty/spirv-cross/reference/shaders/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,11 @@ +#version 450 + +layout(location = 0) out vec4 FragColors[2]; +layout(location = 2) out vec4 FragColor; + +void main() +{ + FragColors = vec4[](vec4(1.0, 2.0, 3.0, 4.0), vec4(10.0)); + FragColor = vec4(5.0); +} + diff --git a/3rdparty/spirv-cross/reference/shaders/asm/frag/temporary-phi-hoisting.asm.frag b/3rdparty/spirv-cross/reference/shaders/asm/frag/temporary-phi-hoisting.asm.frag index 3917594d9..4cee76cca 100644 --- a/3rdparty/spirv-cross/reference/shaders/asm/frag/temporary-phi-hoisting.asm.frag +++ b/3rdparty/spirv-cross/reference/shaders/asm/frag/temporary-phi-hoisting.asm.frag @@ -5,7 +5,7 @@ struct MyStruct vec4 color; }; -layout(std140) uniform MyStruct_CB +layout(binding = 0, std140) uniform MyStruct_CB { MyStruct g_MyStruct[4]; } _6; diff --git a/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-1.invalid.comp b/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-1.invalid.comp index 7420586f0..a4014e893 100644 --- a/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-1.invalid.comp +++ b/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-1.invalid.comp @@ -3,15 +3,11 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif @@ -31,7 +27,7 @@ void main() { uint ident = gl_GlobalInvocationID.x; f16vec2 a = int16BitsToFloat16(_25.inputs[ident].xy); - _39.outputs[ident].x = int(packFloat2x16(a + f16vec2(float16_t(1), float16_t(1)))); + _39.outputs[ident].x = int(packFloat2x16(a + f16vec2(1.0hf))); _39.outputs[ident].y = packInt2x16(_25.inputs[ident].zw); _39.outputs[ident].z = int(packUint2x16(u16vec2(_25.inputs[ident].xy))); } diff --git a/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-2.invalid.comp b/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-2.invalid.comp index 416bc4a2e..bddc16d62 100644 --- a/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-2.invalid.comp +++ b/3rdparty/spirv-cross/reference/shaders/comp/bitcast-16bit-2.invalid.comp @@ -1,8 +1,6 @@ #version 450 #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif @@ -10,8 +8,6 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/shaders/desktop-only/frag/fp16.invalid.desktop.frag b/3rdparty/spirv-cross/reference/shaders/desktop-only/frag/fp16.invalid.desktop.frag index af8882c43..e1fc045c4 100644 --- a/3rdparty/spirv-cross/reference/shaders/desktop-only/frag/fp16.invalid.desktop.frag +++ b/3rdparty/spirv-cross/reference/shaders/desktop-only/frag/fp16.invalid.desktop.frag @@ -3,8 +3,6 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/shaders/desktop-only/vert/basic.desktop.sso.vert b/3rdparty/spirv-cross/reference/shaders/desktop-only/vert/basic.desktop.sso.vert index 5f527e08c..2f880398e 100644 --- a/3rdparty/spirv-cross/reference/shaders/desktop-only/vert/basic.desktop.sso.vert +++ b/3rdparty/spirv-cross/reference/shaders/desktop-only/vert/basic.desktop.sso.vert @@ -5,7 +5,7 @@ out gl_PerVertex vec4 gl_Position; }; -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { mat4 uMVP; } _16; diff --git a/3rdparty/spirv-cross/reference/shaders/frag/16bit-constants.frag b/3rdparty/spirv-cross/reference/shaders/frag/16bit-constants.frag index 48fbad97a..f9ce356fd 100644 --- a/3rdparty/spirv-cross/reference/shaders/frag/16bit-constants.frag +++ b/3rdparty/spirv-cross/reference/shaders/frag/16bit-constants.frag @@ -3,15 +3,11 @@ #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif diff --git a/3rdparty/spirv-cross/reference/shaders/tesc/water_tess.tesc b/3rdparty/spirv-cross/reference/shaders/tesc/water_tess.tesc index 4daaa456e..8d5a4a304 100644 --- a/3rdparty/spirv-cross/reference/shaders/tesc/water_tess.tesc +++ b/3rdparty/spirv-cross/reference/shaders/tesc/water_tess.tesc @@ -2,7 +2,7 @@ #extension GL_EXT_tessellation_shader : require layout(vertices = 1) out; -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { vec4 uScale; vec3 uCamPos; diff --git a/3rdparty/spirv-cross/reference/shaders/vert/basic.vert b/3rdparty/spirv-cross/reference/shaders/vert/basic.vert index 05504eb2f..8f251cbed 100644 --- a/3rdparty/spirv-cross/reference/shaders/vert/basic.vert +++ b/3rdparty/spirv-cross/reference/shaders/vert/basic.vert @@ -1,6 +1,6 @@ #version 310 es -layout(std140) uniform UBO +layout(binding = 0, std140) uniform UBO { mat4 uMVP; } _16; diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp b/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp index 33647a423..7c4c7ed6f 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp @@ -26,7 +26,7 @@ struct B #define SPIRV_CROSS_CONSTANT_ID_2 300 #endif const int c = SPIRV_CROSS_CONSTANT_ID_2; -const int _18 = (c + 50); +const int d = (c + 50); #ifndef SPIRV_CROSS_CONSTANT_ID_3 #define SPIRV_CROSS_CONSTANT_ID_3 400 #endif @@ -37,7 +37,7 @@ layout(binding = 0, std430) buffer SSBO A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; } _22; void main() diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk b/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk index cd68e93d7..b7571b7ab 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/comp/spec-constant-op-member-array.vk.comp.vk @@ -17,7 +17,7 @@ struct B }; layout(constant_id = 2) const int c = 300; -const int _18 = (c + 50); +const int d = (c + 50); layout(constant_id = 3) const int e = 400; layout(set = 1, binding = 0, std430) buffer SSBO @@ -25,7 +25,7 @@ layout(set = 1, binding = 0, std430) buffer SSBO A member_a; B member_b; int v[a]; - int w[_18]; + int w[d]; } _22; void main() diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk new file mode 100644 index 000000000..634a37aa3 --- /dev/null +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag.vk @@ -0,0 +1,88 @@ +#version 450 +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require +#extension GL_EXT_shader_16bit_storage : require +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require +#extension GL_EXT_shader_8bit_storage : require + +layout(set = 0, binding = 1, std430) buffer SSBO +{ + int8_t i8[16]; + uint8_t u8[16]; +} ssbo; + +layout(set = 0, binding = 0, std140) uniform UBO +{ + int8_t i8; + uint8_t u8; +} ubo; + +layout(push_constant, std430) uniform Push +{ + int8_t i8; + uint8_t u8; +} registers; + +layout(location = 0) flat in ivec4 vColor; +layout(location = 0) out ivec4 FragColorInt; +layout(location = 1) out uvec4 FragColorUint; + +void packing_int8() +{ + int16_t i16 = 10s; + int i32 = 20; + i8vec2 i8_2 = unpack8(i16); + i8vec4 i8_4 = unpack8(i32); + i16 = pack16(i8_2); + i32 = pack32(i8_4); + ssbo.i8[0] = i8_4.x; + ssbo.i8[1] = i8_4.y; + ssbo.i8[2] = i8_4.z; + ssbo.i8[3] = i8_4.w; +} + +void packing_uint8() +{ + uint16_t u16 = 10us; + uint u32 = 20u; + u8vec2 u8_2 = unpack8(u16); + u8vec4 u8_4 = unpack8(u32); + u16 = pack16(u8_2); + u32 = pack32(u8_4); + ssbo.u8[0] = u8_4.x; + ssbo.u8[1] = u8_4.y; + ssbo.u8[2] = u8_4.z; + ssbo.u8[3] = u8_4.w; +} + +void compute_int8() +{ + i8vec4 tmp = i8vec4(vColor); + tmp += i8vec4(registers.i8); + tmp += i8vec4(int8_t(-40)); + tmp += i8vec4(-50); + tmp += i8vec4(int8_t(10), int8_t(20), int8_t(30), int8_t(40)); + tmp += i8vec4(ssbo.i8[4]); + tmp += i8vec4(ubo.i8); + FragColorInt = ivec4(tmp); +} + +void compute_uint8() +{ + u8vec4 tmp = u8vec4(i8vec4(vColor)); + tmp += u8vec4(registers.u8); + tmp += u8vec4(uint8_t(216)); + tmp += u8vec4(206); + tmp += u8vec4(uint8_t(10), uint8_t(20), uint8_t(30), uint8_t(40)); + tmp += u8vec4(ssbo.u8[4]); + tmp += u8vec4(ubo.u8); + FragColorUint = uvec4(tmp); +} + +void main() +{ + packing_int8(); + packing_uint8(); + compute_int8(); + compute_uint8(); +} + diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag index e03dfcb9a..081206f1c 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag @@ -5,12 +5,12 @@ #endif const uint s = SPIRV_CROSS_CONSTANT_ID_0; const bool _13 = (s > 20u); -const uint _16 = _13 ? 30u : 50u; +const uint f = _13 ? 30u : 50u; layout(location = 0) out float FragColor; void main() { - FragColor = float(_16); + FragColor = float(f); } diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk index 59d3b99b9..34bfea026 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/frag/spec-constant-ternary.vk.frag.vk @@ -2,12 +2,12 @@ layout(constant_id = 0) const uint s = 10u; const bool _13 = (s > 20u); -const uint _16 = _13 ? 30u : 50u; +const uint f = _13 ? 30u : 50u; layout(location = 0) out float FragColor; void main() { - FragColor = float(_16); + FragColor = float(f); } diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert b/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert index 2ade81104..b3aafc8d8 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert @@ -1,18 +1,14 @@ #version 450 #if defined(GL_AMD_gpu_shader_int16) #extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for Int16. #endif -#extension GL_EXT_shader_8bit_storage : require +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require #if defined(GL_AMD_gpu_shader_half_float) #extension GL_AMD_gpu_shader_half_float : require #elif defined(GL_NV_gpu_shader5) #extension GL_NV_gpu_shader5 : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert.vk b/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert.vk index c283d6064..caec60a2c 100644 --- a/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert.vk +++ b/3rdparty/spirv-cross/reference/shaders/vulkan/vert/small-storage.vk.vert.vk @@ -1,16 +1,12 @@ #version 450 -#if defined(GL_AMD_gpu_shader_int16) -#extension GL_AMD_gpu_shader_int16 : require -#elif defined(GL_EXT_shader_16bit_storage) +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require #extension GL_EXT_shader_16bit_storage : require -#else -#error No extension available for Int16. -#endif +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require #extension GL_EXT_shader_8bit_storage : require #if defined(GL_AMD_gpu_shader_half_float) #extension GL_AMD_gpu_shader_half_float : require -#elif defined(GL_EXT_shader_16bit_storage) -#extension GL_EXT_shader_16bit_storage : require +#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16) +#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require #else #error No extension available for FP16. #endif diff --git a/3rdparty/spirv-cross/shaders-hlsl-no-opt/asm/vert/empty-struct-composite.asm.vert b/3rdparty/spirv-cross/shaders-hlsl-no-opt/asm/vert/empty-struct-composite.asm.vert index 37a2d8793..038ecaa6e 100644 --- a/3rdparty/spirv-cross/shaders-hlsl-no-opt/asm/vert/empty-struct-composite.asm.vert +++ b/3rdparty/spirv-cross/shaders-hlsl-no-opt/asm/vert/empty-struct-composite.asm.vert @@ -7,7 +7,6 @@ %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %2 "main" - OpExecutionMode %2 OriginUpperLeft OpName %Test "Test" OpName %t "t" OpName %retvar "retvar" diff --git a/3rdparty/spirv-cross/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..7763b7c17 --- /dev/null +++ b/3rdparty/spirv-cross/shaders-hlsl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,41 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 25 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColors %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 450 + OpName %main "main" + OpName %FragColors "FragColors" + OpName %FragColor "FragColor" + OpDecorate %FragColors Location 0 + OpDecorate %FragColor Location 2 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2 +%_ptr_Output__arr_v4float_uint_2 = OpTypePointer Output %_arr_v4float_uint_2 + %float_1 = OpConstant %float 1 + %float_2 = OpConstant %float 2 + %float_3 = OpConstant %float 3 + %float_4 = OpConstant %float 4 + %17 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4 + %float_10 = OpConstant %float 10 + %19 = OpConstantComposite %v4float %float_10 %float_10 %float_10 %float_10 + %20 = OpConstantComposite %_arr_v4float_uint_2 %17 %19 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %float_5 = OpConstant %float 5 + %24 = OpConstantComposite %v4float %float_5 %float_5 %float_5 %float_5 + %FragColors = OpVariable %_ptr_Output__arr_v4float_uint_2 Output %20 + %FragColor = OpVariable %_ptr_Output_v4float Output %24 + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd diff --git a/3rdparty/spirv-cross/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert b/3rdparty/spirv-cross/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert index 85acc47ff..4587fc1e9 100644 --- a/3rdparty/spirv-cross/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert +++ b/3rdparty/spirv-cross/shaders-hlsl/asm/vert/vertex-id-instance-id.asm.vert @@ -22,8 +22,8 @@ OpMemberDecorate %gl_PerVertex 2 BuiltIn ClipDistance OpMemberDecorate %gl_PerVertex 3 BuiltIn CullDistance OpDecorate %gl_PerVertex Block - OpDecorate %gl_VertexID BuiltIn VertexId - OpDecorate %gl_InstanceID BuiltIn InstanceId + OpDecorate %gl_VertexID BuiltIn VertexIndex + OpDecorate %gl_InstanceID BuiltIn InstanceIndex %void = OpTypeVoid %3 = OpTypeFunction %void %float = OpTypeFloat 32 diff --git a/3rdparty/spirv-cross/shaders-msl-no-opt/asm/vert/empty-struct-composite.asm.vert b/3rdparty/spirv-cross/shaders-msl-no-opt/asm/vert/empty-struct-composite.asm.vert index 37a2d8793..038ecaa6e 100644 --- a/3rdparty/spirv-cross/shaders-msl-no-opt/asm/vert/empty-struct-composite.asm.vert +++ b/3rdparty/spirv-cross/shaders-msl-no-opt/asm/vert/empty-struct-composite.asm.vert @@ -7,7 +7,6 @@ %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %2 "main" - OpExecutionMode %2 OriginUpperLeft OpName %Test "Test" OpName %t "t" OpName %retvar "retvar" diff --git a/3rdparty/spirv-cross/shaders-msl/asm/comp/buffer-write.asm.comp b/3rdparty/spirv-cross/shaders-msl/asm/comp/buffer-write.asm.comp index aa7b32089..697324ba6 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/comp/buffer-write.asm.comp +++ b/3rdparty/spirv-cross/shaders-msl/asm/comp/buffer-write.asm.comp @@ -22,6 +22,7 @@ OpDecorate %_ DescriptorSet 0 OpDecorate %_ Binding 7 OpDecorate %buffer DescriptorSet 0 + OpDecorate %buffer Binding 0 OpDecorate %group_id BuiltIn WorkgroupId OpDecorate %group_index BuiltIn LocalInvocationIndex %void = OpTypeVoid diff --git a/3rdparty/spirv-cross/shaders-msl/asm/comp/multiple-entry.asm.comp b/3rdparty/spirv-cross/shaders-msl/asm/comp/multiple-entry.asm.comp index 0cfb5543d..9ddc07bcc 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/comp/multiple-entry.asm.comp +++ b/3rdparty/spirv-cross/shaders-msl/asm/comp/multiple-entry.asm.comp @@ -9,6 +9,7 @@ OpEntryPoint Fragment %func_alt "main2" %frag_in %frag_out OpEntryPoint GLCompute %func "main" OpExecutionMode %func LocalSize 1 1 1 + OpExecutionMode %func_alt OriginUpperLeft OpSource ESSL 310 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" OpSourceExtension "GL_GOOGLE_include_directive" diff --git a/3rdparty/spirv-cross/shaders-msl/asm/comp/struct-resource-name-aliasing.asm.comp b/3rdparty/spirv-cross/shaders-msl/asm/comp/struct-resource-name-aliasing.asm.comp index 98d31537e..384da305a 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/comp/struct-resource-name-aliasing.asm.comp +++ b/3rdparty/spirv-cross/shaders-msl/asm/comp/struct-resource-name-aliasing.asm.comp @@ -20,6 +20,8 @@ OpDecorate %bufA BufferBlock OpDecorate %bufA_0 DescriptorSet 0 OpDecorate %bufB DescriptorSet 0 + OpDecorate %bufA_0 Binding 0 + OpDecorate %bufB Binding 1 %void = OpTypeVoid %3 = OpTypeFunction %void %uint = OpTypeInt 32 0 diff --git a/3rdparty/spirv-cross/shaders-msl/asm/frag/default-member-names.asm.frag b/3rdparty/spirv-cross/shaders-msl/asm/frag/default-member-names.asm.frag index 4d616fe49..ba493c0f9 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/frag/default-member-names.asm.frag +++ b/3rdparty/spirv-cross/shaders-msl/asm/frag/default-member-names.asm.frag @@ -7,7 +7,7 @@ %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %2 "main" %3 - OpExecutionMode %2 OriginLowerLeft + OpExecutionMode %2 OriginUpperLeft OpDecorate %3 Location 0 %void = OpTypeVoid %9 = OpTypeFunction %void diff --git a/3rdparty/spirv-cross/shaders-msl/asm/frag/extract-packed-from-composite.asm.frag b/3rdparty/spirv-cross/shaders-msl/asm/frag/extract-packed-from-composite.asm.frag index e205a15c4..b27f598a8 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/frag/extract-packed-from-composite.asm.frag +++ b/3rdparty/spirv-cross/shaders-msl/asm/frag/extract-packed-from-composite.asm.frag @@ -34,6 +34,7 @@ OpMemberDecorate %buf 1 Offset 256 OpDecorate %buf Block OpDecorate %_ DescriptorSet 0 + OpDecorate %_ Binding 0 OpDecorate %pos_1 BuiltIn FragCoord OpDecorate %_entryPointOutput Location 0 %void = OpTypeVoid diff --git a/3rdparty/spirv-cross/shaders-msl/asm/frag/locations-components.asm.frag b/3rdparty/spirv-cross/shaders-msl/asm/frag/locations-components.asm.frag index bf8c6a690..16bfc525b 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/frag/locations-components.asm.frag +++ b/3rdparty/spirv-cross/shaders-msl/asm/frag/locations-components.asm.frag @@ -6,6 +6,7 @@ OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %8 %16 %22 %28 %33 %o0 + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %v1 "v1" OpName %v2 "v2" diff --git a/3rdparty/spirv-cross/shaders-msl/asm/frag/op-image-sampled-image.asm.frag b/3rdparty/spirv-cross/shaders-msl/asm/frag/op-image-sampled-image.asm.frag index 4dbede7bb..bf7ec56d7 100644 --- a/3rdparty/spirv-cross/shaders-msl/asm/frag/op-image-sampled-image.asm.frag +++ b/3rdparty/spirv-cross/shaders-msl/asm/frag/op-image-sampled-image.asm.frag @@ -6,6 +6,7 @@ OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %o0 + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %t0 "t0" OpName %o0 "o0" diff --git a/3rdparty/spirv-cross/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..7763b7c17 --- /dev/null +++ b/3rdparty/spirv-cross/shaders-msl/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,41 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 25 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColors %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 450 + OpName %main "main" + OpName %FragColors "FragColors" + OpName %FragColor "FragColor" + OpDecorate %FragColors Location 0 + OpDecorate %FragColor Location 2 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2 +%_ptr_Output__arr_v4float_uint_2 = OpTypePointer Output %_arr_v4float_uint_2 + %float_1 = OpConstant %float 1 + %float_2 = OpConstant %float 2 + %float_3 = OpConstant %float 3 + %float_4 = OpConstant %float 4 + %17 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4 + %float_10 = OpConstant %float 10 + %19 = OpConstantComposite %v4float %float_10 %float_10 %float_10 %float_10 + %20 = OpConstantComposite %_arr_v4float_uint_2 %17 %19 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %float_5 = OpConstant %float 5 + %24 = OpConstantComposite %v4float %float_5 %float_5 %float_5 %float_5 + %FragColors = OpVariable %_ptr_Output__arr_v4float_uint_2 Output %20 + %FragColor = OpVariable %_ptr_Output_v4float Output %24 + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd diff --git a/3rdparty/spirv-cross/shaders-msl/frag/shader-arithmetic-8bit.frag b/3rdparty/spirv-cross/shaders-msl/frag/shader-arithmetic-8bit.frag new file mode 100644 index 000000000..9416f5ba2 --- /dev/null +++ b/3rdparty/spirv-cross/shaders-msl/frag/shader-arithmetic-8bit.frag @@ -0,0 +1,88 @@ +#version 450 +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require + +layout(location = 0) flat in ivec4 vColor; +layout(location = 0) out ivec4 FragColorInt; +layout(location = 1) out uvec4 FragColorUint; + +layout(push_constant, std140) uniform Push +{ + int8_t i8; + uint8_t u8; +} registers; + +layout(binding = 1, std140) uniform UBO +{ + int8_t i8; + uint8_t u8; +} ubo; + +layout(binding = 2, std430) buffer SSBO +{ + int8_t i8[16]; + uint8_t u8[16]; +} ssbo; + +void packing_int8() +{ + int16_t i16 = 10s; + int i32 = 20; + + i8vec2 i8_2 = unpack8(i16); + i8vec4 i8_4 = unpack8(i32); + i16 = pack16(i8_2); + i32 = pack32(i8_4); + ssbo.i8[0] = i8_4.x; + ssbo.i8[1] = i8_4.y; + ssbo.i8[2] = i8_4.z; + ssbo.i8[3] = i8_4.w; +} + +void packing_uint8() +{ + uint16_t u16 = 10us; + uint u32 = 20u; + + u8vec2 u8_2 = unpack8(u16); + u8vec4 u8_4 = unpack8(u32); + u16 = pack16(u8_2); + u32 = pack32(u8_4); + + ssbo.u8[0] = u8_4.x; + ssbo.u8[1] = u8_4.y; + ssbo.u8[2] = u8_4.z; + ssbo.u8[3] = u8_4.w; +} + +void compute_int8() +{ + i8vec4 tmp = i8vec4(vColor); + tmp += registers.i8; + tmp += int8_t(-40); + tmp += i8vec4(-50); + tmp += i8vec4(10, 20, 30, 40); + tmp += ssbo.i8[4]; + tmp += ubo.i8; + FragColorInt = ivec4(tmp); +} + +void compute_uint8() +{ + u8vec4 tmp = u8vec4(vColor); + tmp += registers.u8; + tmp += uint8_t(-40); + tmp += u8vec4(-50); + tmp += u8vec4(10, 20, 30, 40); + tmp += ssbo.u8[4]; + tmp += ubo.u8; + FragColorUint = uvec4(tmp); +} + +void main() +{ + packing_int8(); + packing_uint8(); + compute_int8(); + compute_uint8(); +} diff --git a/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays-leaf.ios.vert b/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays-leaf.ios.vert index d097d5983..b35c410f5 100644 --- a/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays-leaf.ios.vert +++ b/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays-leaf.ios.vert @@ -3,12 +3,13 @@ layout(constant_id = 0) const int arraySize = 3; layout(binding = 0, rgba32i) uniform iimage2D images[arraySize]; -uniform constant_block +layout(binding = 4) uniform constant_block { vec4 foo; int bar; } constants[4]; -buffer storage_block + +layout(binding = 8) buffer storage_block { uvec4 baz; ivec2 quux; diff --git a/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays.ios.vert b/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays.ios.vert index a2082a437..cddc06ae2 100644 --- a/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays.ios.vert +++ b/3rdparty/spirv-cross/shaders-msl/vert/resource-arrays.ios.vert @@ -3,12 +3,14 @@ layout(constant_id = 0) const int arraySize = 3; layout(binding = 0, rgba32i) uniform iimage2D images[arraySize]; -uniform constant_block + +layout(binding = 4) uniform constant_block { vec4 foo; int bar; } constants[4]; -buffer storage_block + +layout(binding = 8) buffer storage_block { uvec4 baz; ivec2 quux; diff --git a/3rdparty/spirv-cross/shaders-no-opt/asm/vert/empty-struct-composite.asm.vert b/3rdparty/spirv-cross/shaders-no-opt/asm/vert/empty-struct-composite.asm.vert index 37a2d8793..038ecaa6e 100644 --- a/3rdparty/spirv-cross/shaders-no-opt/asm/vert/empty-struct-composite.asm.vert +++ b/3rdparty/spirv-cross/shaders-no-opt/asm/vert/empty-struct-composite.asm.vert @@ -7,7 +7,6 @@ %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Vertex %2 "main" - OpExecutionMode %2 OriginUpperLeft OpName %Test "Test" OpName %t "t" OpName %retvar "retvar" diff --git a/3rdparty/spirv-cross/shaders/asm/comp/hlsl-functionality.asm.comp b/3rdparty/spirv-cross/shaders/asm/comp/hlsl-functionality.asm.comp index dfdcb4540..d43111397 100644 --- a/3rdparty/spirv-cross/shaders/asm/comp/hlsl-functionality.asm.comp +++ b/3rdparty/spirv-cross/shaders/asm/comp/hlsl-functionality.asm.comp @@ -26,6 +26,7 @@ OpMemberDecorate %Buf_count 0 Offset 0 OpDecorate %Buf_count BufferBlock OpDecorate %Buf_count_0 DescriptorSet 0 + OpDecorate %Buf_count_0 Binding 1 OpDecorateId %Buf_0 HlslCounterBufferGOOGLE %Buf_count_0 %void = OpTypeVoid %3 = OpTypeFunction %void diff --git a/3rdparty/spirv-cross/shaders/asm/comp/multiple-entry.asm.comp b/3rdparty/spirv-cross/shaders/asm/comp/multiple-entry.asm.comp index 0cfb5543d..9ddc07bcc 100644 --- a/3rdparty/spirv-cross/shaders/asm/comp/multiple-entry.asm.comp +++ b/3rdparty/spirv-cross/shaders/asm/comp/multiple-entry.asm.comp @@ -9,6 +9,7 @@ OpEntryPoint Fragment %func_alt "main2" %frag_in %frag_out OpEntryPoint GLCompute %func "main" OpExecutionMode %func LocalSize 1 1 1 + OpExecutionMode %func_alt OriginUpperLeft OpSource ESSL 310 OpSourceExtension "GL_GOOGLE_cpp_style_line_directive" OpSourceExtension "GL_GOOGLE_include_directive" diff --git a/3rdparty/spirv-cross/shaders/asm/frag/default-member-names.asm.frag b/3rdparty/spirv-cross/shaders/asm/frag/default-member-names.asm.frag index 4d616fe49..ba493c0f9 100644 --- a/3rdparty/spirv-cross/shaders/asm/frag/default-member-names.asm.frag +++ b/3rdparty/spirv-cross/shaders/asm/frag/default-member-names.asm.frag @@ -7,7 +7,7 @@ %1 = OpExtInstImport "GLSL.std.450" OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %2 "main" %3 - OpExecutionMode %2 OriginLowerLeft + OpExecutionMode %2 OriginUpperLeft OpDecorate %3 Location 0 %void = OpTypeVoid %9 = OpTypeFunction %void diff --git a/3rdparty/spirv-cross/shaders/asm/frag/locations-components.asm.frag b/3rdparty/spirv-cross/shaders/asm/frag/locations-components.asm.frag index bf8c6a690..16bfc525b 100644 --- a/3rdparty/spirv-cross/shaders/asm/frag/locations-components.asm.frag +++ b/3rdparty/spirv-cross/shaders/asm/frag/locations-components.asm.frag @@ -6,6 +6,7 @@ OpCapability Shader OpMemoryModel Logical GLSL450 OpEntryPoint Fragment %main "main" %8 %16 %22 %28 %33 %o0 + OpExecutionMode %main OriginUpperLeft OpName %main "main" OpName %v1 "v1" OpName %v2 "v2" diff --git a/3rdparty/spirv-cross/shaders/asm/frag/storage-class-output-initializer.asm.frag b/3rdparty/spirv-cross/shaders/asm/frag/storage-class-output-initializer.asm.frag new file mode 100644 index 000000000..7763b7c17 --- /dev/null +++ b/3rdparty/spirv-cross/shaders/asm/frag/storage-class-output-initializer.asm.frag @@ -0,0 +1,41 @@ +; SPIR-V +; Version: 1.0 +; Generator: Khronos Glslang Reference Front End; 7 +; Bound: 25 +; Schema: 0 + OpCapability Shader + %1 = OpExtInstImport "GLSL.std.450" + OpMemoryModel Logical GLSL450 + OpEntryPoint Fragment %main "main" %FragColors %FragColor + OpExecutionMode %main OriginUpperLeft + OpSource GLSL 450 + OpName %main "main" + OpName %FragColors "FragColors" + OpName %FragColor "FragColor" + OpDecorate %FragColors Location 0 + OpDecorate %FragColor Location 2 + %void = OpTypeVoid + %3 = OpTypeFunction %void + %float = OpTypeFloat 32 + %v4float = OpTypeVector %float 4 + %uint = OpTypeInt 32 0 + %uint_2 = OpConstant %uint 2 +%_arr_v4float_uint_2 = OpTypeArray %v4float %uint_2 +%_ptr_Output__arr_v4float_uint_2 = OpTypePointer Output %_arr_v4float_uint_2 + %float_1 = OpConstant %float 1 + %float_2 = OpConstant %float 2 + %float_3 = OpConstant %float 3 + %float_4 = OpConstant %float 4 + %17 = OpConstantComposite %v4float %float_1 %float_2 %float_3 %float_4 + %float_10 = OpConstant %float 10 + %19 = OpConstantComposite %v4float %float_10 %float_10 %float_10 %float_10 + %20 = OpConstantComposite %_arr_v4float_uint_2 %17 %19 +%_ptr_Output_v4float = OpTypePointer Output %v4float + %float_5 = OpConstant %float 5 + %24 = OpConstantComposite %v4float %float_5 %float_5 %float_5 %float_5 + %FragColors = OpVariable %_ptr_Output__arr_v4float_uint_2 Output %20 + %FragColor = OpVariable %_ptr_Output_v4float Output %24 + %main = OpFunction %void None %3 + %5 = OpLabel + OpReturn + OpFunctionEnd diff --git a/3rdparty/spirv-cross/shaders/asm/frag/temporary-phi-hoisting.asm.frag b/3rdparty/spirv-cross/shaders/asm/frag/temporary-phi-hoisting.asm.frag index 7cedcd581..977c20ac3 100644 --- a/3rdparty/spirv-cross/shaders/asm/frag/temporary-phi-hoisting.asm.frag +++ b/3rdparty/spirv-cross/shaders/asm/frag/temporary-phi-hoisting.asm.frag @@ -21,6 +21,7 @@ OpMemberDecorate %MyStruct_CB 0 Offset 0 OpDecorate %MyStruct_CB Block OpDecorate %_ DescriptorSet 0 + OpDecorate %_ Binding 0 OpDecorate %_entryPointOutput Location 0 %void = OpTypeVoid %3 = OpTypeFunction %void diff --git a/3rdparty/spirv-cross/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag b/3rdparty/spirv-cross/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag new file mode 100644 index 000000000..d70b0dad9 --- /dev/null +++ b/3rdparty/spirv-cross/shaders/vulkan/frag/shader-arithmetic-8bit.nocompat.vk.frag @@ -0,0 +1,88 @@ +#version 450 +#extension GL_EXT_shader_explicit_arithmetic_types_int8 : require +#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require + +layout(location = 0) flat in ivec4 vColor; +layout(location = 0) out ivec4 FragColorInt; +layout(location = 1) out uvec4 FragColorUint; + +layout(push_constant, std140) uniform Push +{ + int8_t i8; + uint8_t u8; +} registers; + +layout(binding = 0, std140) uniform UBO +{ + int8_t i8; + uint8_t u8; +} ubo; + +layout(binding = 1, std430) buffer SSBO +{ + int8_t i8[16]; + uint8_t u8[16]; +} ssbo; + +void packing_int8() +{ + int16_t i16 = 10s; + int i32 = 20; + + i8vec2 i8_2 = unpack8(i16); + i8vec4 i8_4 = unpack8(i32); + i16 = pack16(i8_2); + i32 = pack32(i8_4); + ssbo.i8[0] = i8_4.x; + ssbo.i8[1] = i8_4.y; + ssbo.i8[2] = i8_4.z; + ssbo.i8[3] = i8_4.w; +} + +void packing_uint8() +{ + uint16_t u16 = 10us; + uint u32 = 20u; + + u8vec2 u8_2 = unpack8(u16); + u8vec4 u8_4 = unpack8(u32); + u16 = pack16(u8_2); + u32 = pack32(u8_4); + + ssbo.u8[0] = u8_4.x; + ssbo.u8[1] = u8_4.y; + ssbo.u8[2] = u8_4.z; + ssbo.u8[3] = u8_4.w; +} + +void compute_int8() +{ + i8vec4 tmp = i8vec4(vColor); + tmp += registers.i8; + tmp += int8_t(-40); + tmp += i8vec4(-50); + tmp += i8vec4(10, 20, 30, 40); + tmp += ssbo.i8[4]; + tmp += ubo.i8; + FragColorInt = ivec4(tmp); +} + +void compute_uint8() +{ + u8vec4 tmp = u8vec4(vColor); + tmp += registers.u8; + tmp += uint8_t(-40); + tmp += u8vec4(-50); + tmp += u8vec4(10, 20, 30, 40); + tmp += ssbo.u8[4]; + tmp += ubo.u8; + FragColorUint = uvec4(tmp); +} + +void main() +{ + packing_int8(); + packing_uint8(); + compute_int8(); + compute_uint8(); +} diff --git a/3rdparty/spirv-cross/spirv_common.hpp b/3rdparty/spirv-cross/spirv_common.hpp index 6852542ee..aa32142de 100644 --- a/3rdparty/spirv-cross/spirv_common.hpp +++ b/3rdparty/spirv-cross/spirv_common.hpp @@ -1047,6 +1047,16 @@ struct SPIRConstant : IVariant return uint16_t(m.c[col].r[row].u32 & 0xffffu); } + inline int8_t scalar_i8(uint32_t col = 0, uint32_t row = 0) const + { + return int8_t(m.c[col].r[row].u32 & 0xffu); + } + + inline uint8_t scalar_u8(uint32_t col = 0, uint32_t row = 0) const + { + return uint8_t(m.c[col].r[row].u32 & 0xffu); + } + inline float scalar_f16(uint32_t col = 0, uint32_t row = 0) const { return f16_to_f32(scalar_u16(col, row)); @@ -1435,6 +1445,61 @@ static inline bool type_is_integral(const SPIRType &type) type.basetype == SPIRType::UShort || type.basetype == SPIRType::Int || type.basetype == SPIRType::UInt || type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64; } + +static inline SPIRType::BaseType to_signed_basetype(uint32_t width) +{ + switch (width) + { + case 8: + return SPIRType::SByte; + case 16: + return SPIRType::Short; + case 32: + return SPIRType::Int; + case 64: + return SPIRType::Int64; + default: + SPIRV_CROSS_THROW("Invalid bit width."); + } +} + +static inline SPIRType::BaseType to_unsigned_basetype(uint32_t width) +{ + switch (width) + { + case 8: + return SPIRType::UByte; + case 16: + return SPIRType::UShort; + case 32: + return SPIRType::UInt; + case 64: + return SPIRType::UInt64; + default: + SPIRV_CROSS_THROW("Invalid bit width."); + } +} + +// Returns true if an arithmetic operation does not change behavior depending on signedness. +static inline bool opcode_is_sign_invariant(spv::Op opcode) +{ + switch (opcode) + { + case spv::OpIEqual: + case spv::OpINotEqual: + case spv::OpISub: + case spv::OpIAdd: + case spv::OpIMul: + case spv::OpShiftLeftLogical: + case spv::OpBitwiseOr: + case spv::OpBitwiseXor: + case spv::OpBitwiseAnd: + return true; + + default: + return false; + } +} } // namespace spirv_cross #endif diff --git a/3rdparty/spirv-cross/spirv_cross.cpp b/3rdparty/spirv-cross/spirv_cross.cpp index ef3ec249c..19bac3011 100644 --- a/3rdparty/spirv-cross/spirv_cross.cpp +++ b/3rdparty/spirv-cross/spirv_cross.cpp @@ -701,6 +701,12 @@ unordered_set Compiler::get_active_interface_variables() const InterfaceVariableAccessHandler handler(*this, variables); traverse_all_reachable_opcodes(get(ir.default_entry_point), handler); + // Make sure we preserve output variables which are only initialized, but never accessed by any code. + ir.for_each_typed_id([&](uint32_t, const SPIRVariable &var) { + if (var.storage == StorageClassOutput && var.initializer != 0) + variables.insert(var.self); + }); + // If we needed to create one, we'll need it. if (dummy_sampler_id) variables.insert(dummy_sampler_id); diff --git a/3rdparty/spirv-cross/spirv_glsl.cpp b/3rdparty/spirv-cross/spirv_glsl.cpp index 131bc803d..a8855987e 100644 --- a/3rdparty/spirv-cross/spirv_glsl.cpp +++ b/3rdparty/spirv-cross/spirv_glsl.cpp @@ -149,27 +149,6 @@ string CompilerGLSL::sanitize_underscores(const string &str) return res; } -// Returns true if an arithmetic operation does not change behavior depending on signedness. -static bool glsl_opcode_is_sign_invariant(Op opcode) -{ - switch (opcode) - { - case OpIEqual: - case OpINotEqual: - case OpISub: - case OpIAdd: - case OpIMul: - case OpShiftLeftLogical: - case OpBitwiseOr: - case OpBitwiseXor: - case OpBitwiseAnd: - return true; - - default: - return false; - } -} - static const char *to_pls_layout(PlsFormat format) { switch (format) @@ -342,23 +321,31 @@ void CompilerGLSL::find_static_extensions() if (!options.es && options.version < 400) require_extension_internal("GL_ARB_gpu_shader_fp64"); } - - if (type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64) + else if (type.basetype == SPIRType::Int64 || type.basetype == SPIRType::UInt64) { if (options.es) SPIRV_CROSS_THROW("64-bit integers not supported in ES profile."); if (!options.es) require_extension_internal("GL_ARB_gpu_shader_int64"); } - - if (type.basetype == SPIRType::Half) - require_extension_internal("GL_AMD_gpu_shader_half_float"); - - if (type.basetype == SPIRType::SByte || type.basetype == SPIRType::UByte) - require_extension_internal("GL_EXT_shader_8bit_storage"); - - if (type.basetype == SPIRType::Short || type.basetype == SPIRType::UShort) - require_extension_internal("GL_AMD_gpu_shader_int16"); + else if (type.basetype == SPIRType::Half) + { + require_extension_internal("GL_EXT_shader_explicit_arithmetic_types_float16"); + if (options.vulkan_semantics) + require_extension_internal("GL_EXT_shader_16bit_storage"); + } + else if (type.basetype == SPIRType::SByte || type.basetype == SPIRType::UByte) + { + require_extension_internal("GL_EXT_shader_explicit_arithmetic_types_int8"); + if (options.vulkan_semantics) + require_extension_internal("GL_EXT_shader_8bit_storage"); + } + else if (type.basetype == SPIRType::Short || type.basetype == SPIRType::UShort) + { + require_extension_internal("GL_EXT_shader_explicit_arithmetic_types_int16"); + if (options.vulkan_semantics) + require_extension_internal("GL_EXT_shader_16bit_storage"); + } }); auto &execution = get_entry_point(); @@ -508,7 +495,7 @@ void CompilerGLSL::emit_header() for (auto &ext : forced_extensions) { - if (ext == "GL_AMD_gpu_shader_half_float") + if (ext == "GL_EXT_shader_explicit_arithmetic_types_float16") { // Special case, this extension has a potential fallback to another vendor extension in normal GLSL. // GL_AMD_gpu_shader_half_float is a superset, so try that first. @@ -519,22 +506,27 @@ void CompilerGLSL::emit_header() statement("#elif defined(GL_NV_gpu_shader5)"); statement("#extension GL_NV_gpu_shader5 : require"); } - statement("#elif defined(GL_EXT_shader_16bit_storage)"); - statement("#extension GL_EXT_shader_16bit_storage : require"); + else + { + statement("#elif defined(GL_EXT_shader_explicit_arithmetic_types_float16)"); + statement("#extension GL_EXT_shader_explicit_arithmetic_types_float16 : require"); + } statement("#else"); statement("#error No extension available for FP16."); statement("#endif"); } - else if (ext == "GL_AMD_gpu_shader_int16") + else if (ext == "GL_EXT_shader_explicit_arithmetic_types_int16") { - // GL_AMD_gpu_shader_int16 is a superset, so try that first. - statement("#if defined(GL_AMD_gpu_shader_int16)"); - statement("#extension GL_AMD_gpu_shader_int16 : require"); - statement("#elif defined(GL_EXT_shader_16bit_storage)"); - statement("#extension GL_EXT_shader_16bit_storage : require"); - statement("#else"); - statement("#error No extension available for Int16."); - statement("#endif"); + if (options.vulkan_semantics) + statement("#extension GL_EXT_shader_explicit_arithmetic_types_int16 : require"); + else + { + statement("#if defined(GL_AMD_gpu_shader_int16)"); + statement("#extension GL_AMD_gpu_shader_int16 : require"); + statement("#else"); + statement("#error No extension available for Int16."); + statement("#endif"); + } } else statement("#extension ", ext, " : require"); @@ -960,7 +952,7 @@ uint32_t CompilerGLSL::type_to_packed_alignment(const SPIRType &type, const Bits if (type.basetype == SPIRType::Struct) { // Rule 9. Structs alignments are maximum alignment of its members. - uint32_t alignment = 0; + uint32_t alignment = 1; for (uint32_t i = 0; i < type.member_types.size(); i++) { auto member_flags = ir.meta[type.self].members[i].decoration_flags; @@ -1743,6 +1735,14 @@ void CompilerGLSL::emit_interface_block(const SPIRVariable &var) add_resource_name(var.self); statement(layout_for_variable(var), to_qualifiers_glsl(var.self), variable_decl(type, to_name(var.self), var.self), ";"); + + // If a StorageClassOutput variable has an initializer, we need to initialize it in main(). + if (var.storage == StorageClassOutput && var.initializer) + { + auto &entry_func = this->get(ir.default_entry_point); + entry_func.fixup_hooks_in.push_back( + [&]() { statement(to_name(var.self), " = ", to_expression(var.initializer), ";"); }); + } } } } @@ -2791,14 +2791,38 @@ string CompilerGLSL::constant_op_expression(const SPIRConstantOp &cop) SPIRV_CROSS_THROW("Unimplemented spec constant op."); } + uint32_t bit_width = 0; + if (unary || binary) + bit_width = expression_type(cop.arguments[0]).width; + SPIRType::BaseType input_type; - bool skip_cast_if_equal_type = glsl_opcode_is_sign_invariant(cop.opcode); + bool skip_cast_if_equal_type = opcode_is_sign_invariant(cop.opcode); switch (cop.opcode) { case OpIEqual: case OpINotEqual: - input_type = SPIRType::Int; + input_type = to_signed_basetype(bit_width); + break; + + case OpSLessThan: + case OpSLessThanEqual: + case OpSGreaterThan: + case OpSGreaterThanEqual: + case OpSMod: + case OpSDiv: + case OpShiftRightArithmetic: + input_type = to_signed_basetype(bit_width); + break; + + case OpULessThan: + case OpULessThanEqual: + case OpUGreaterThan: + case OpUGreaterThanEqual: + case OpUMod: + case OpUDiv: + case OpShiftRightLogical: + input_type = to_unsigned_basetype(bit_width); break; default: @@ -3113,6 +3137,9 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t auto type = get(c.constant_type); type.columns = 1; + auto scalar_type = type; + scalar_type.vecsize = 1; + string res; bool splat = backend.use_constructor_splatting && c.vector_size() > 1; bool swizzle_splat = backend.can_swizzle_scalar && c.vector_size() > 1; @@ -3421,6 +3448,56 @@ string CompilerGLSL::constant_expression_vector(const SPIRConstant &c, uint32_t } break; + case SPIRType::UByte: + if (splat) + { + res += convert_to_string(c.scalar_u8(vector, 0)); + } + else + { + for (uint32_t i = 0; i < c.vector_size(); i++) + { + if (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0) + res += to_name(c.specialization_constant_id(vector, i)); + else + { + res += type_to_glsl(scalar_type); + res += "("; + res += convert_to_string(c.scalar_u8(vector, i)); + res += ")"; + } + + if (i + 1 < c.vector_size()) + res += ", "; + } + } + break; + + case SPIRType::SByte: + if (splat) + { + res += convert_to_string(c.scalar_i8(vector, 0)); + } + else + { + for (uint32_t i = 0; i < c.vector_size(); i++) + { + if (c.vector_size() > 1 && c.specialization_constant_id(vector, i) != 0) + res += to_name(c.specialization_constant_id(vector, i)); + else + { + res += type_to_glsl(scalar_type); + res += "("; + res += convert_to_string(c.scalar_i8(vector, i)); + res += ")"; + } + + if (i + 1 < c.vector_size()) + res += ", "; + } + } + break; + case SPIRType::Boolean: if (splat) res += c.scalar(vector, 0) ? "true" : "false"; @@ -5177,20 +5254,31 @@ case OpGroupNonUniform##op: \ string CompilerGLSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in_type) { - if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::Short) + if (out_type.basetype == in_type.basetype) + return ""; + + assert(out_type.basetype != SPIRType::Boolean); + assert(in_type.basetype != SPIRType::Boolean); + + bool integral_cast = type_is_integral(out_type) && type_is_integral(in_type); + bool same_size_cast = out_type.width == in_type.width; + + // Trivial bitcast case, casts between integers. + if (integral_cast && same_size_cast) return type_to_glsl(out_type); - else if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Int) - return type_to_glsl(out_type); - else if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Int64) - return type_to_glsl(out_type); - else if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Float) + + // Catch-all 8-bit arithmetic casts (GL_EXT_shader_explicit_arithmetic_types). + if (out_type.width == 8 && in_type.width >= 16 && integral_cast && in_type.vecsize == 1) + return "unpack8"; + else if (in_type.width == 8 && out_type.width == 16 && integral_cast && out_type.vecsize == 1) + return "pack16"; + else if (in_type.width == 8 && out_type.width == 32 && integral_cast && out_type.vecsize == 1) + return "pack32"; + + // Floating <-> Integer special casts. Just have to enumerate all cases. :( + // 16-bit, 32-bit and 64-bit floats. + if (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Float) return "floatBitsToUint"; - else if (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::UShort) - return type_to_glsl(out_type); - else if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::UInt) - return type_to_glsl(out_type); - else if (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::UInt64) - return type_to_glsl(out_type); else if (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Float) return "floatBitsToInt"; else if (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::UInt) @@ -5213,7 +5301,9 @@ string CompilerGLSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &i return "int16BitsToFloat16"; else if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UShort) return "uint16BitsToFloat16"; - else if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::UInt && in_type.vecsize == 2) + + // And finally, some even more special purpose casts. + if (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::UInt && in_type.vecsize == 2) return "packUint2x32"; else if (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UInt && in_type.vecsize == 1) return "unpackFloat2x16"; @@ -5235,8 +5325,8 @@ string CompilerGLSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &i return "packUint4x16"; else if (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::UInt64 && in_type.vecsize == 1) return "unpackUint4x16"; - else - return ""; + + return ""; } string CompilerGLSL::bitcast_glsl(const SPIRType &result_type, uint32_t argument) @@ -6654,6 +6744,35 @@ void CompilerGLSL::emit_store_statement(uint32_t lhs_expression, uint32_t rhs_ex } } +uint32_t CompilerGLSL::get_integer_width_for_instruction(const Instruction &instr) const +{ + if (instr.length < 3) + return 32; + + auto *ops = stream(instr); + + switch (instr.op) + { + case OpIEqual: + case OpINotEqual: + case OpSLessThan: + case OpSLessThanEqual: + case OpSGreaterThan: + case OpSGreaterThanEqual: + return expression_type(ops[2]).width; + + default: + { + // We can look at result type which is more robust. + auto *type = maybe_get(ops[0]); + if (type && type_is_integral(*type)) + return type->width; + else + return 32; + } + } +} + void CompilerGLSL::emit_instruction(const Instruction &instruction) { auto ops = stream(instruction); @@ -6662,16 +6781,21 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) #define GLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op) #define GLSL_BOP_CAST(op, type) \ - emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, glsl_opcode_is_sign_invariant(opcode)) + emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode)) #define GLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op) #define GLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op) #define GLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op) #define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op) #define GLSL_BFOP_CAST(op, type) \ - emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, glsl_opcode_is_sign_invariant(opcode)) + emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode)) #define GLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op) #define GLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op) + // If we need to do implicit bitcasts, make sure we do it with the correct type. + uint32_t integer_width = get_integer_width_for_instruction(instruction); + auto int_type = to_signed_basetype(integer_width); + auto uint_type = to_unsigned_basetype(integer_width); + switch (opcode) { // Dealing with memory @@ -7349,11 +7473,11 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) } case OpSDiv: - GLSL_BOP_CAST(/, SPIRType::Int); + GLSL_BOP_CAST(/, int_type); break; case OpUDiv: - GLSL_BOP_CAST(/, SPIRType::UInt); + GLSL_BOP_CAST(/, uint_type); break; case OpIAddCarry: @@ -7411,11 +7535,11 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) break; case OpShiftRightLogical: - GLSL_BOP_CAST(>>, SPIRType::UInt); + GLSL_BOP_CAST(>>, uint_type); break; case OpShiftRightArithmetic: - GLSL_BOP_CAST(>>, SPIRType::Int); + GLSL_BOP_CAST(>>, int_type); break; case OpShiftLeftLogical: @@ -7451,11 +7575,11 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) break; case OpUMod: - GLSL_BOP_CAST(%, SPIRType::UInt); + GLSL_BOP_CAST(%, uint_type); break; case OpSMod: - GLSL_BOP_CAST(%, SPIRType::Int); + GLSL_BOP_CAST(%, int_type); break; case OpFMod: @@ -7538,9 +7662,9 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) case OpIEqual: { if (expression_type(ops[2]).vecsize > 1) - GLSL_BFOP_CAST(equal, SPIRType::Int); + GLSL_BFOP_CAST(equal, int_type); else - GLSL_BOP_CAST(==, SPIRType::Int); + GLSL_BOP_CAST(==, int_type); break; } @@ -7557,9 +7681,9 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction) case OpINotEqual: { if (expression_type(ops[2]).vecsize > 1) - GLSL_BFOP_CAST(notEqual, SPIRType::Int); + GLSL_BFOP_CAST(notEqual, int_type); else - GLSL_BOP_CAST(!=, SPIRType::Int); + GLSL_BOP_CAST(!=, int_type); break; } diff --git a/3rdparty/spirv-cross/spirv_glsl.hpp b/3rdparty/spirv-cross/spirv_glsl.hpp index e19228c24..caf0ad3b1 100644 --- a/3rdparty/spirv-cross/spirv_glsl.hpp +++ b/3rdparty/spirv-cross/spirv_glsl.hpp @@ -636,6 +636,8 @@ protected: bool expression_is_constant_null(uint32_t id) const; virtual void emit_store_statement(uint32_t lhs_expression, uint32_t rhs_expression); + uint32_t get_integer_width_for_instruction(const Instruction &instr) const; + private: void init() { diff --git a/3rdparty/spirv-cross/spirv_hlsl.cpp b/3rdparty/spirv-cross/spirv_hlsl.cpp index 4b470a1be..a5b6d2dc6 100644 --- a/3rdparty/spirv-cross/spirv_hlsl.cpp +++ b/3rdparty/spirv-cross/spirv_hlsl.cpp @@ -203,27 +203,6 @@ static string image_format_to_type(ImageFormat fmt, SPIRType::BaseType basetype) } } -// Returns true if an arithmetic operation does not change behavior depending on signedness. -static bool hlsl_opcode_is_sign_invariant(Op opcode) -{ - switch (opcode) - { - case OpIEqual: - case OpINotEqual: - case OpISub: - case OpIAdd: - case OpIMul: - case OpShiftLeftLogical: - case OpBitwiseOr: - case OpBitwiseXor: - case OpBitwiseAnd: - return true; - - default: - return false; - } -} - string CompilerHLSL::image_type_hlsl_modern(const SPIRType &type, uint32_t) { auto &imagetype = get(type.image.type); @@ -1390,50 +1369,6 @@ void CompilerHLSL::emit_resources() } } - if (requires_textureProj) - { - if (hlsl_options.shader_model >= 40) - { - statement("float SPIRV_Cross_projectTextureCoordinate(float2 coord)"); - begin_scope(); - statement("return coord.x / coord.y;"); - end_scope(); - statement(""); - - statement("float2 SPIRV_Cross_projectTextureCoordinate(float3 coord)"); - begin_scope(); - statement("return float2(coord.x, coord.y) / coord.z;"); - end_scope(); - statement(""); - - statement("float3 SPIRV_Cross_projectTextureCoordinate(float4 coord)"); - begin_scope(); - statement("return float3(coord.x, coord.y, coord.z) / coord.w;"); - end_scope(); - statement(""); - } - else - { - statement("float4 SPIRV_Cross_projectTextureCoordinate(float2 coord)"); - begin_scope(); - statement("return float4(coord.x, 0.0, 0.0, coord.y);"); - end_scope(); - statement(""); - - statement("float4 SPIRV_Cross_projectTextureCoordinate(float3 coord)"); - begin_scope(); - statement("return float4(coord.x, coord.y, 0.0, coord.z);"); - end_scope(); - statement(""); - - statement("float4 SPIRV_Cross_projectTextureCoordinate(float4 coord)"); - begin_scope(); - statement("return coord;"); - end_scope(); - statement(""); - } - } - if (required_textureSizeVariants != 0) { static const char *types[QueryTypeCount] = { "float4", "int4", "uint4" }; @@ -2575,8 +2510,6 @@ void CompilerHLSL::emit_texture_op(const Instruction &i) if (dref) inherited_expressions.push_back(dref); - if (proj) - coord_components++; if (imgtype.image.arrayed) coord_components++; @@ -2775,17 +2708,14 @@ void CompilerHLSL::emit_texture_op(const Instruction &i) bool forward = should_forward(coord); // The IR can give us more components than we need, so chop them off as needed. - auto coord_expr = to_expression(coord) + swizzle(coord_components, expression_type(coord).vecsize); + string coord_expr; + if (coord_components != expression_type(coord).vecsize) + coord_expr = to_enclosed_expression(coord) + swizzle(coord_components, expression_type(coord).vecsize); + else + coord_expr = to_expression(coord); - if (proj) - { - if (!requires_textureProj) - { - requires_textureProj = true; - force_recompile = true; - } - coord_expr = "SPIRV_Cross_projectTextureCoordinate(" + coord_expr + ")"; - } + if (proj && hlsl_options.shader_model >= 40) // Legacy HLSL has "proj" operations which do this for us. + coord_expr = coord_expr + " / " + to_extract_component_expression(coord, coord_components); if (hlsl_options.shader_model < 40 && lod) { @@ -2822,9 +2752,16 @@ void CompilerHLSL::emit_texture_op(const Instruction &i) if (dref) { + if (hlsl_options.shader_model < 40) + SPIRV_CROSS_THROW("Legacy HLSL does not support comparison sampling."); + forward = forward && should_forward(dref); expr += ", "; - expr += to_expression(dref); + + if (proj) + expr += to_enclosed_expression(dref) + " / " + to_extract_component_expression(coord, coord_components); + else + expr += to_expression(dref); } if (!dref && (grad_x || grad_y)) @@ -2951,7 +2888,12 @@ string CompilerHLSL::to_resource_binding(const SPIRVariable &var) else if (storage == StorageClassPushConstant) space = 'b'; // Constant buffers else if (storage == StorageClassStorageBuffer) - space = 'u'; // UAV + { + // UAV or SRV depending on readonly flag. + Bitset flags = ir.get_buffer_block_flags(var); + bool is_readonly = flags.get(DecorationNonWritable); + space = is_readonly ? 't' : 'u'; + } break; } @@ -3580,8 +3522,14 @@ void CompilerHLSL::emit_access_chain(const Instruction &instruction) bool need_byte_access_chain = false; auto &type = expression_type(ops[2]); - const SPIRAccessChain *chain = nullptr; - if (type.storage == StorageClassStorageBuffer || has_decoration(type.self, DecorationBufferBlock)) + const auto *chain = maybe_get(ops[2]); + + if (chain) + { + // Keep tacking on an existing access chain. + need_byte_access_chain = true; + } + else if (type.storage == StorageClassStorageBuffer || has_decoration(type.self, DecorationBufferBlock)) { // If we are starting to poke into an SSBO, we are dealing with ByteAddressBuffers, and we need // to emit SPIRAccessChain rather than a plain SPIRExpression. @@ -3589,13 +3537,6 @@ void CompilerHLSL::emit_access_chain(const Instruction &instruction) if (chain_arguments > type.array.size()) need_byte_access_chain = true; } - else - { - // Keep tacking on an existing access chain. - chain = maybe_get(ops[2]); - if (chain) - need_byte_access_chain = true; - } if (need_byte_access_chain) { @@ -3934,16 +3875,20 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction) #define HLSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op) #define HLSL_BOP_CAST(op, type) \ - emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, hlsl_opcode_is_sign_invariant(opcode)) + emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode)) #define HLSL_UOP(op) emit_unary_op(ops[0], ops[1], ops[2], #op) #define HLSL_QFOP(op) emit_quaternary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], ops[5], #op) #define HLSL_TFOP(op) emit_trinary_func_op(ops[0], ops[1], ops[2], ops[3], ops[4], #op) #define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op) #define HLSL_BFOP_CAST(op, type) \ - emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, hlsl_opcode_is_sign_invariant(opcode)) + emit_binary_func_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode)) #define HLSL_BFOP(op) emit_binary_func_op(ops[0], ops[1], ops[2], ops[3], #op) #define HLSL_UFOP(op) emit_unary_func_op(ops[0], ops[1], ops[2], #op) + // If we need to do implicit bitcasts, make sure we do it with the correct type. + uint32_t integer_width = get_integer_width_for_instruction(instruction); + auto int_type = to_signed_basetype(integer_width); + switch (opcode) { case OpAccessChain: @@ -4079,7 +4024,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction) if (expression_type(ops[2]).vecsize > 1) emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "=="); else - HLSL_BOP_CAST(==, SPIRType::Int); + HLSL_BOP_CAST(==, int_type); break; } @@ -4104,7 +4049,7 @@ void CompilerHLSL::emit_instruction(const Instruction &instruction) if (expression_type(ops[2]).vecsize > 1) emit_unrolled_binary_op(result_type, id, ops[2], ops[3], "!="); else - HLSL_BOP_CAST(!=, SPIRType::Int); + HLSL_BOP_CAST(!=, int_type); break; } diff --git a/3rdparty/spirv-cross/spirv_hlsl.hpp b/3rdparty/spirv-cross/spirv_hlsl.hpp index d06229cde..b2b60fcab 100644 --- a/3rdparty/spirv-cross/spirv_hlsl.hpp +++ b/3rdparty/spirv-cross/spirv_hlsl.hpp @@ -184,7 +184,6 @@ private: Options hlsl_options; bool requires_op_fmod = false; - bool requires_textureProj = false; bool requires_fp16_packing = false; bool requires_explicit_fp16_packing = false; bool requires_unorm8_packing = false; diff --git a/3rdparty/spirv-cross/spirv_msl.cpp b/3rdparty/spirv-cross/spirv_msl.cpp index 98fe3ae05..0e1e733db 100644 --- a/3rdparty/spirv-cross/spirv_msl.cpp +++ b/3rdparty/spirv-cross/spirv_msl.cpp @@ -369,7 +369,7 @@ void CompilerMSL::emit_entry_point_declarations() for (uint32_t i = 0; i < type.array[0]; ++i) statement(name + "_" + convert_to_string(i) + ","); end_scope_decl(); - statement(""); + statement_no_indent(""); } // For some reason, without this, we end up emitting the arrays twice. buffer_arrays.clear(); @@ -851,10 +851,10 @@ void CompilerMSL::add_plain_variable_to_interface_block(StorageClass storage, co // Update the original variable reference to include the structure reference string qual_var_name = ib_var_ref + "." + mbr_name; + auto &entry_func = get(ir.default_entry_point); if (padded_output) { - auto &entry_func = get(ir.default_entry_point); entry_func.add_local_variable(var.self); vars_needing_early_declaration.push_back(var.self); @@ -866,6 +866,12 @@ void CompilerMSL::add_plain_variable_to_interface_block(StorageClass storage, co else ir.meta[var.self].decoration.qualified_alias = qual_var_name; + if (var.storage == StorageClassOutput && var.initializer != 0) + { + entry_func.fixup_hooks_in.push_back( + [=, &var]() { statement(qual_var_name, " = ", to_expression(var.initializer), ";"); }); + } + // Copy the variable location from the original variable to the member if (get_decoration_bitset(var.self).get(DecorationLocation)) { @@ -1565,11 +1571,11 @@ void CompilerMSL::align_struct(SPIRType &ib_type) // Align current offset to the current member's default alignment. size_t align_mask = get_declared_struct_member_alignment(ib_type, mbr_idx) - 1; - curr_offset = uint32_t((curr_offset + align_mask) & ~align_mask); + uint32_t aligned_curr_offset = uint32_t((curr_offset + align_mask) & ~align_mask); // Fetch the member offset as declared in the SPIRV. uint32_t mbr_offset = get_member_decoration(ib_type_id, mbr_idx, DecorationOffset); - if (mbr_offset > curr_offset) + if (mbr_offset > aligned_curr_offset) { // Since MSL and SPIR-V have slightly different struct member alignment and // size rules, we'll pad to standard C-packing rules. If the member is farther @@ -1610,6 +1616,18 @@ bool CompilerMSL::is_member_packable(SPIRType &ib_type, uint32_t index) return true; } + // Check for array of struct, where the SPIR-V declares an array stride which is larger than the struct itself. + // This can happen for struct A { float a }; A a[]; in std140 layout. + // TODO: Emit a padded struct which can be used for this purpose. + if (is_array(mbr_type) && mbr_type.basetype == SPIRType::Struct) + { + size_t declared_struct_size = get_declared_struct_size(mbr_type); + size_t alignment = get_declared_struct_member_alignment(ib_type, index); + declared_struct_size = (declared_struct_size + alignment - 1) & ~(alignment - 1); + if (type_struct_member_array_stride(ib_type, index) > declared_struct_size) + return true; + } + // TODO: Another sanity check for matrices. We currently do not support std140 matrices which need to be padded out per column. //if (is_matrix(mbr_type) && mbr_type.vecsize <= 2 && type_struct_member_matrix_stride(ib_type, index) == 16) // SPIRV_CROSS_THROW("Currently cannot support matrices with small vector size in std140 layout."); @@ -2423,7 +2441,6 @@ void CompilerMSL::emit_binary_unord_op(uint32_t result_type, uint32_t result_id, // Override for MSL-specific syntax instructions void CompilerMSL::emit_instruction(const Instruction &instruction) { - #define MSL_BOP(op) emit_binary_op(ops[0], ops[1], ops[2], ops[3], #op) #define MSL_BOP_CAST(op, type) \ emit_binary_op_cast(ops[0], ops[1], ops[2], ops[3], #op, type, opcode_is_sign_invariant(opcode)) @@ -2439,42 +2456,77 @@ void CompilerMSL::emit_instruction(const Instruction &instruction) auto ops = stream(instruction); auto opcode = static_cast(instruction.op); + // If we need to do implicit bitcasts, make sure we do it with the correct type. + uint32_t integer_width = get_integer_width_for_instruction(instruction); + auto int_type = to_signed_basetype(integer_width); + auto uint_type = to_unsigned_basetype(integer_width); + switch (opcode) { // Comparisons case OpIEqual: + MSL_BOP_CAST(==, int_type); + break; + case OpLogicalEqual: case OpFOrdEqual: MSL_BOP(==); break; case OpINotEqual: + MSL_BOP_CAST(!=, int_type); + break; + case OpLogicalNotEqual: case OpFOrdNotEqual: MSL_BOP(!=); break; case OpUGreaterThan: + MSL_BOP_CAST(>, uint_type); + break; + case OpSGreaterThan: + MSL_BOP_CAST(>, int_type); + break; + case OpFOrdGreaterThan: MSL_BOP(>); break; case OpUGreaterThanEqual: + MSL_BOP_CAST(>=, uint_type); + break; + case OpSGreaterThanEqual: + MSL_BOP_CAST(>=, int_type); + break; + case OpFOrdGreaterThanEqual: MSL_BOP(>=); break; case OpULessThan: + MSL_BOP_CAST(<, uint_type); + break; + case OpSLessThan: + MSL_BOP_CAST(<, int_type); + break; + case OpFOrdLessThan: MSL_BOP(<); break; case OpULessThanEqual: + MSL_BOP_CAST(<=, uint_type); + break; + case OpSLessThanEqual: + MSL_BOP_CAST(<=, int_type); + break; + case OpFOrdLessThanEqual: MSL_BOP(<=); break; @@ -3371,10 +3423,13 @@ void CompilerMSL::emit_function_prototype(SPIRFunction &func, const Bitset &) for (auto var_id : vars_needing_early_declaration) { auto &ed_var = get(var_id); - if (!ed_var.initializer) - ed_var.initializer = ir.increase_bound_by(1); + uint32_t &initializer = ed_var.initializer; + if (!initializer) + initializer = ir.increase_bound_by(1); - set(ed_var.initializer, "{}", ed_var.basetype, true); + // Do not override proper initializers. + if (ir.ids[initializer].get_type() == TypeNone || ir.ids[initializer].get_type() == TypeExpression) + set(ed_var.initializer, "{}", ed_var.basetype, true); } } @@ -3503,32 +3558,30 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool bool is_cube_fetch = false; string tex_coords = coord_expr; - const char *alt_coord = ""; + uint32_t alt_coord_component = 0; switch (imgtype.image.dim) { case Dim1D: if (coord_type.vecsize > 1) - tex_coords += ".x"; + tex_coords = enclose_expression(tex_coords) + ".x"; if (is_fetch) tex_coords = "uint(" + round_fp_tex_coords(tex_coords, coord_is_fp) + ")"; - alt_coord = ".y"; - + alt_coord_component = 1; break; case DimBuffer: if (coord_type.vecsize > 1) - tex_coords += ".x"; + tex_coords = enclose_expression(tex_coords) + ".x"; // Metal texel buffer textures are 2D, so convert 1D coord to 2D. if (is_fetch) tex_coords = "spvTexelBufferCoord(" + round_fp_tex_coords(tex_coords, coord_is_fp) + ")"; - alt_coord = ".y"; - + alt_coord_component = 1; break; case DimSubpassData: @@ -3540,24 +3593,22 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool case Dim2D: if (coord_type.vecsize > 2) - tex_coords += ".xy"; + tex_coords = enclose_expression(tex_coords) + ".xy"; if (is_fetch) tex_coords = "uint2(" + round_fp_tex_coords(tex_coords, coord_is_fp) + ")"; - alt_coord = ".z"; - + alt_coord_component = 2; break; case Dim3D: if (coord_type.vecsize > 3) - tex_coords += ".xyz"; + tex_coords = enclose_expression(tex_coords) + ".xyz"; if (is_fetch) tex_coords = "uint3(" + round_fp_tex_coords(tex_coords, coord_is_fp) + ")"; - alt_coord = ".w"; - + alt_coord_component = 3; break; case DimCube: @@ -3570,11 +3621,10 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool else { if (coord_type.vecsize > 3) - tex_coords += ".xyz"; + tex_coords = enclose_expression(tex_coords) + ".xyz"; } - alt_coord = ".w"; - + alt_coord_component = 3; break; default: @@ -3604,7 +3654,7 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool // If projection, use alt coord as divisor if (is_proj) - tex_coords += " / " + coord_expr + alt_coord; + tex_coords += " / " + to_extract_component_expression(coord, alt_coord_component); if (!farg_str.empty()) farg_str += ", "; @@ -3615,9 +3665,9 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool { // Special case for cube arrays, face and layer are packed in one dimension. if (imgtype.image.arrayed) - farg_str += ", uint(" + join(coord_expr, ".z) % 6u"); + farg_str += ", uint(" + to_extract_component_expression(coord, 2) + ") % 6u"; else - farg_str += ", uint(" + round_fp_tex_coords(coord_expr + ".z", coord_is_fp) + ")"; + farg_str += ", uint(" + round_fp_tex_coords(to_extract_component_expression(coord, 2), coord_is_fp) + ")"; } // If array, use alt coord @@ -3625,9 +3675,11 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool { // Special case for cube arrays, face and layer are packed in one dimension. if (imgtype.image.dim == DimCube && is_fetch) - farg_str += ", uint(" + join(coord_expr, ".z) / 6u"); + farg_str += ", uint(" + to_extract_component_expression(coord, 2) + ") / 6u"; else - farg_str += ", uint(" + round_fp_tex_coords(coord_expr + alt_coord, coord_is_fp) + ")"; + farg_str += ", uint(" + + round_fp_tex_coords(to_extract_component_expression(coord, alt_coord_component), coord_is_fp) + + ")"; } // Depth compare reference value @@ -3635,7 +3687,12 @@ string CompilerMSL::to_function_args(uint32_t img, const SPIRType &imgtype, bool { forward = forward && should_forward(dref); farg_str += ", "; - farg_str += to_expression(dref); + + if (is_proj) + farg_str += + to_enclosed_expression(dref) + " / " + to_extract_component_expression(coord, alt_coord_component); + else + farg_str += to_expression(dref); if (msl_options.is_macos() && (grad_x || grad_y)) { @@ -4028,7 +4085,7 @@ void CompilerMSL::emit_struct_member(const SPIRType &type, uint32_t member_type_ MSLStructMemberKey key = get_struct_member_key(type.self, index); uint32_t pad_len = struct_member_padding[key]; if (pad_len > 0) - statement("char pad", to_string(index), "[", to_string(pad_len), "];"); + statement("char _m", index, "_pad", "[", to_string(pad_len), "];"); // If this member is packed, mark it as so. string pack_pfx = ""; @@ -4039,7 +4096,11 @@ void CompilerMSL::emit_struct_member(const SPIRType &type, uint32_t member_type_ if (member_is_packed_type(type, index)) { // If we're packing a matrix, output an appropriate typedef - if (membertype.vecsize > 1 && membertype.columns > 1) + if (membertype.basetype == SPIRType::Struct) + { + pack_pfx = "/* FIXME: A padded struct is needed here. If you see this message, file a bug! */ "; + } + else if (membertype.vecsize > 1 && membertype.columns > 1) { pack_pfx = "packed_"; string base_type = membertype.width == 16 ? "half" : "float"; @@ -5406,37 +5467,25 @@ string CompilerMSL::image_type_glsl(const SPIRType &type, uint32_t id) string CompilerMSL::bitcast_glsl_op(const SPIRType &out_type, const SPIRType &in_type) { - if ((out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::Short) || - (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::UShort) || - (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Int) || - (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::UInt) || - (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Int64) || - (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::UInt64)) + if (out_type.basetype == in_type.basetype) + return ""; + + assert(out_type.basetype != SPIRType::Boolean); + assert(in_type.basetype != SPIRType::Boolean); + + bool integral_cast = type_is_integral(out_type) && type_is_integral(in_type); + bool same_size_cast = out_type.width == in_type.width; + + if (integral_cast && same_size_cast) + { + // Trivial bitcast case, casts between integers. return type_to_glsl(out_type); - - if ((out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Float) || - (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Float) || - (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::UInt) || - (out_type.basetype == SPIRType::Float && in_type.basetype == SPIRType::Int) || - (out_type.basetype == SPIRType::Int64 && in_type.basetype == SPIRType::Double) || - (out_type.basetype == SPIRType::UInt64 && in_type.basetype == SPIRType::Double) || - (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::Int64) || - (out_type.basetype == SPIRType::Double && in_type.basetype == SPIRType::UInt64) || - (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UInt) || - (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::Half) || - (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::Int) || - (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Half) || - (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::UShort) || - (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::Half) || - (out_type.basetype == SPIRType::Half && in_type.basetype == SPIRType::Short) || - (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::Half) || - (out_type.basetype == SPIRType::UInt && in_type.basetype == SPIRType::UShort && in_type.vecsize == 2) || - (out_type.basetype == SPIRType::UShort && in_type.basetype == SPIRType::UInt && in_type.vecsize == 1) || - (out_type.basetype == SPIRType::Int && in_type.basetype == SPIRType::Short && in_type.vecsize == 2) || - (out_type.basetype == SPIRType::Short && in_type.basetype == SPIRType::Int && in_type.vecsize == 1)) + } + else + { + // Fall back to the catch-all bitcast in MSL. return "as_type<" + type_to_glsl(out_type) + ">"; - - return ""; + } } // Returns an MSL string identifying the name of a SPIR-V builtin. @@ -5679,7 +5728,12 @@ size_t CompilerMSL::get_declared_struct_member_size(const SPIRType &struct_type, } if (type.basetype == SPIRType::Struct) - return get_declared_struct_size(type); + { + // The size of a struct in Metal is aligned up to its natural alignment. + auto size = get_declared_struct_size(type); + auto alignment = get_declared_struct_member_alignment(struct_type, index); + return (size + alignment - 1) & ~(alignment - 1); + } uint32_t component_size = type.width / 8; uint32_t vecsize = type.vecsize; @@ -5710,7 +5764,13 @@ size_t CompilerMSL::get_declared_struct_member_alignment(const SPIRType &struct_ SPIRV_CROSS_THROW("Querying alignment of opaque object."); case SPIRType::Struct: - return 16; // Per Vulkan spec section 14.5.4 + { + // In MSL, a struct's alignment is equal to the maximum alignment of any of its members. + uint32_t alignment = 1; + for (uint32_t i = 0; i < type.member_types.size(); i++) + alignment = max(alignment, uint32_t(get_declared_struct_member_alignment(type, i))); + return alignment; + } default: { @@ -5718,7 +5778,18 @@ size_t CompilerMSL::get_declared_struct_member_alignment(const SPIRType &struct_ // Alignment of unpacked type is the same as the vector size. // Alignment of 3-elements vector is the same as 4-elements (including packed using column). if (member_is_packed_type(struct_type, index)) - return (type.width / 8) * (type.columns == 3 ? 4 : type.columns); + { + // This is getting pretty complicated. + // The special case of array of float/float2 needs to be handled here. + uint32_t packed_type_id = + get_extended_member_decoration(struct_type.self, index, SPIRVCrossDecorationPackedType); + const SPIRType *packed_type = packed_type_id != 0 ? &get(packed_type_id) : nullptr; + if (packed_type && is_array(*packed_type) && !is_matrix(*packed_type) && + packed_type->basetype != SPIRType::Struct) + return (packed_type->width / 8) * 4; + else + return (type.width / 8) * (type.columns == 3 ? 4 : type.columns); + } else return (type.width / 8) * (type.vecsize == 3 ? 4 : type.vecsize); } diff --git a/3rdparty/spirv-cross/spirv_parser.cpp b/3rdparty/spirv-cross/spirv_parser.cpp index 2f76144e8..1725b4ca3 100644 --- a/3rdparty/spirv-cross/spirv_parser.cpp +++ b/3rdparty/spirv-cross/spirv_parser.cpp @@ -461,23 +461,7 @@ void Parser::parse(const Instruction &instruction) uint32_t width = ops[1]; bool signedness = ops[2] != 0; auto &type = set(id); - switch (width) - { - case 64: - type.basetype = signedness ? SPIRType::Int64 : SPIRType::UInt64; - break; - case 32: - type.basetype = signedness ? SPIRType::Int : SPIRType::UInt; - break; - case 16: - type.basetype = signedness ? SPIRType::Short : SPIRType::UShort; - break; - case 8: - type.basetype = signedness ? SPIRType::SByte : SPIRType::UByte; - break; - default: - SPIRV_CROSS_THROW("Unrecognized bit-width of integral type."); - } + type.basetype = signedness ? to_signed_basetype(width) : to_unsigned_basetype(width); type.width = width; break; } diff --git a/3rdparty/spirv-cross/spirv_reflect.cpp b/3rdparty/spirv-cross/spirv_reflect.cpp index 75f7a3083..54eb64fb7 100644 --- a/3rdparty/spirv-cross/spirv_reflect.cpp +++ b/3rdparty/spirv-cross/spirv_reflect.cpp @@ -475,7 +475,8 @@ void CompilerReflection::emit_resources(const char *tag, const vector { bool is_sized_block = is_block && (get_storage_class(res.id) == StorageClassUniform || - get_storage_class(res.id) == StorageClassUniformConstant); + get_storage_class(res.id) == StorageClassUniformConstant || + get_storage_class(res.id) == StorageClassStorageBuffer); if (is_sized_block) { uint32_t block_size = uint32_t(get_declared_struct_size(get_type(res.base_type_id)));