Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/KhronosGroup/SPIRV-Cross.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Hollings <bill.hollings@brenwill.com>2022-02-26 03:58:22 +0300
committerHans-Kristian Arntzen <post@arntzen-software.no>2022-03-03 12:18:40 +0300
commit3d4daab29dd07d531cb309a6db85e87bdc4db220 (patch)
tree0fff6bb1dbcb37276b57ab66619f7305a303eca7 /reference/opt/shaders-msl
parentd16183d1d2ac7265c2a070b5a662e679169fc7de (diff)
MSL: Support input/output blocks containing nested struct arrays
Fixes numerous CTS tests of types dEQP-VK.pipeline.interface_matching.vector_length.member_of_*, passing complex nested structs between stages as stage I/O. - Make add_composite_member_variable_to_interface_block() recursive to allow struct members to contain nested structs, building up member names and access chains recursively, and only add the resulting flattened leaf members to the synthetic input and output interface blocks. - Recursively generate individual location numbers for the flattened members of the input/output block. - Replace to_qualified_member_name() with append_member_name(). - Update add_variable_to_interface_block() to support arrays as struct members, adding a member to input and output interface blocks for each element of the array. - Pass name qualifiers to add_plain_member_variable_to_interface_block() to allow struct members to be arrays of structs, building up member names and access chains, and adding multiple distinct flattened leaf members to the synthetic input and output interface blocks. - Generate individual location numbers for the individual array members of the input/output block. - SPIRVCrossDecorationInterfaceMemberIndex references the index of a member of a variable that is a struct type. The value is relative to the variable, and for structs nested within that top-level struct, the index value needs to take into consideration the members within those nested structs. - Pass var_mbr_idx to add_plain_member_variable_to_interface_block() and add_composite_member_variable_to_interface_block(), start at zero for each variable, and increment for each member or nested member within that variable. - Add unit test shaders-msl/vert/out-block-with-nested-struct-array.vert - Add unit test shaders-msl/vert/out-block-with-struct-array.vert - Add unit test shaders-msl/tese/in-block-with-nested-struct.tese
Diffstat (limited to 'reference/opt/shaders-msl')
-rw-r--r--reference/opt/shaders-msl/tese/in-block-with-nested-struct.tese43
-rw-r--r--reference/opt/shaders-msl/vert/out-block-with-nested-struct-array.vert88
-rw-r--r--reference/opt/shaders-msl/vert/out-block-with-struct-array.vert83
3 files changed, 214 insertions, 0 deletions
diff --git a/reference/opt/shaders-msl/tese/in-block-with-nested-struct.tese b/reference/opt/shaders-msl/tese/in-block-with-nested-struct.tese
new file mode 100644
index 00000000..f177debf
--- /dev/null
+++ b/reference/opt/shaders-msl/tese/in-block-with-nested-struct.tese
@@ -0,0 +1,43 @@
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+struct _RESERVED_IDENTIFIER_FIXUP_35
+{
+ float2 _RESERVED_IDENTIFIER_FIXUP_m0;
+ float4 _RESERVED_IDENTIFIER_FIXUP_m1;
+};
+
+struct _RESERVED_IDENTIFIER_FIXUP_36
+{
+ float2 _RESERVED_IDENTIFIER_FIXUP_m0;
+ _RESERVED_IDENTIFIER_FIXUP_35 _RESERVED_IDENTIFIER_FIXUP_m1;
+};
+
+struct main0_out
+{
+ float _RESERVED_IDENTIFIER_FIXUP_80 [[user(locn0)]];
+ float4 gl_Position [[position]];
+};
+
+struct main0_in
+{
+ float2 _RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m0 [[attribute(0)]];
+ float2 _RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m0 [[attribute(1)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m1 [[attribute(2)]];
+};
+
+struct main0_patchIn
+{
+ patch_control_point<main0_in> gl_in;
+};
+
+[[ patch(triangle, 0) ]] vertex main0_out main0(main0_patchIn patchIn [[stage_in]], float3 gl_TessCoord [[position_in_patch]])
+{
+ main0_out out = {};
+ out.gl_Position = float4((gl_TessCoord.xy * 2.0) - float2(1.0), 0.0, 1.0);
+ out._RESERVED_IDENTIFIER_FIXUP_80 = ((float(abs(patchIn.gl_in[0]._RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m1.x - (-4.0)) < 0.001000000047497451305389404296875) * float(abs(patchIn.gl_in[0]._RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m1.y - (-9.0)) < 0.001000000047497451305389404296875)) * float(abs(patchIn.gl_in[0]._RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m1.z - 3.0) < 0.001000000047497451305389404296875)) * float(abs(patchIn.gl_in[0]._RESERVED_IDENTIFIER_FIXUP_36_RESERVED_IDENTIFIER_FIXUP_m1_RESERVED_IDENTIFIER_FIXUP_m1.w - 7.0) < 0.001000000047497451305389404296875);
+ return out;
+}
+
diff --git a/reference/opt/shaders-msl/vert/out-block-with-nested-struct-array.vert b/reference/opt/shaders-msl/vert/out-block-with-nested-struct-array.vert
new file mode 100644
index 00000000..5a42d8d8
--- /dev/null
+++ b/reference/opt/shaders-msl/vert/out-block-with-nested-struct-array.vert
@@ -0,0 +1,88 @@
+#pragma clang diagnostic ignored "-Wmissing-prototypes"
+#pragma clang diagnostic ignored "-Wmissing-braces"
+
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+template<typename T, size_t Num>
+struct spvUnsafeArray
+{
+ T elements[Num ? Num : 1];
+
+ thread T& operator [] (size_t pos) thread
+ {
+ return elements[pos];
+ }
+ constexpr const thread T& operator [] (size_t pos) const thread
+ {
+ return elements[pos];
+ }
+
+ device T& operator [] (size_t pos) device
+ {
+ return elements[pos];
+ }
+ constexpr const device T& operator [] (size_t pos) const device
+ {
+ return elements[pos];
+ }
+
+ constexpr const constant T& operator [] (size_t pos) const constant
+ {
+ return elements[pos];
+ }
+
+ threadgroup T& operator [] (size_t pos) threadgroup
+ {
+ return elements[pos];
+ }
+ constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
+ {
+ return elements[pos];
+ }
+};
+
+struct _RESERVED_IDENTIFIER_FIXUP_21
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_m0;
+ float4 _RESERVED_IDENTIFIER_FIXUP_m1;
+};
+
+struct _RESERVED_IDENTIFIER_FIXUP_24
+{
+ spvUnsafeArray<_RESERVED_IDENTIFIER_FIXUP_21, 3> _RESERVED_IDENTIFIER_FIXUP_m0;
+};
+
+struct main0_out
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_0_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn0)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_0_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn1)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_1_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn2)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_1_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn3)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_2_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn4)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_2_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn5)]];
+ float4 gl_Position [[position]];
+};
+
+struct main0_in
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_17 [[attribute(0)]];
+};
+
+vertex main0_out main0(main0_in in [[stage_in]])
+{
+ main0_out out = {};
+ _RESERVED_IDENTIFIER_FIXUP_24 _RESERVED_IDENTIFIER_FIXUP_26 = {};
+ out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_17;
+ _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[1]._RESERVED_IDENTIFIER_FIXUP_m1 = float4(-4.0, -9.0, 3.0, 7.0);
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_0_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[0]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_0_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[0]._RESERVED_IDENTIFIER_FIXUP_m1;
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_1_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[1]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_1_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[1]._RESERVED_IDENTIFIER_FIXUP_m1;
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_2_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[2]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_24_RESERVED_IDENTIFIER_FIXUP_m0_2_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_26._RESERVED_IDENTIFIER_FIXUP_m0[2]._RESERVED_IDENTIFIER_FIXUP_m1;
+ return out;
+}
+
diff --git a/reference/opt/shaders-msl/vert/out-block-with-struct-array.vert b/reference/opt/shaders-msl/vert/out-block-with-struct-array.vert
new file mode 100644
index 00000000..d9a35c4f
--- /dev/null
+++ b/reference/opt/shaders-msl/vert/out-block-with-struct-array.vert
@@ -0,0 +1,83 @@
+#pragma clang diagnostic ignored "-Wmissing-prototypes"
+#pragma clang diagnostic ignored "-Wmissing-braces"
+
+#include <metal_stdlib>
+#include <simd/simd.h>
+
+using namespace metal;
+
+template<typename T, size_t Num>
+struct spvUnsafeArray
+{
+ T elements[Num ? Num : 1];
+
+ thread T& operator [] (size_t pos) thread
+ {
+ return elements[pos];
+ }
+ constexpr const thread T& operator [] (size_t pos) const thread
+ {
+ return elements[pos];
+ }
+
+ device T& operator [] (size_t pos) device
+ {
+ return elements[pos];
+ }
+ constexpr const device T& operator [] (size_t pos) const device
+ {
+ return elements[pos];
+ }
+
+ constexpr const constant T& operator [] (size_t pos) const constant
+ {
+ return elements[pos];
+ }
+
+ threadgroup T& operator [] (size_t pos) threadgroup
+ {
+ return elements[pos];
+ }
+ constexpr const threadgroup T& operator [] (size_t pos) const threadgroup
+ {
+ return elements[pos];
+ }
+};
+
+struct _RESERVED_IDENTIFIER_FIXUP_21
+{
+ float _RESERVED_IDENTIFIER_FIXUP_m0;
+ float4 _RESERVED_IDENTIFIER_FIXUP_m1;
+};
+
+struct main0_out
+{
+ float _RESERVED_IDENTIFIER_FIXUP_21_0_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn0)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_21_0_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn1)]];
+ float _RESERVED_IDENTIFIER_FIXUP_21_1_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn2)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_21_1_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn3)]];
+ float _RESERVED_IDENTIFIER_FIXUP_21_2_RESERVED_IDENTIFIER_FIXUP_m0 [[user(locn4)]];
+ float4 _RESERVED_IDENTIFIER_FIXUP_21_2_RESERVED_IDENTIFIER_FIXUP_m1 [[user(locn5)]];
+ float4 gl_Position [[position]];
+};
+
+struct main0_in
+{
+ float4 _RESERVED_IDENTIFIER_FIXUP_17 [[attribute(0)]];
+};
+
+vertex main0_out main0(main0_in in [[stage_in]])
+{
+ main0_out out = {};
+ spvUnsafeArray<_RESERVED_IDENTIFIER_FIXUP_21, 3> _RESERVED_IDENTIFIER_FIXUP_25 = {};
+ out.gl_Position = in._RESERVED_IDENTIFIER_FIXUP_17;
+ _RESERVED_IDENTIFIER_FIXUP_25[2]._RESERVED_IDENTIFIER_FIXUP_m1 = float4(-4.0, -9.0, 3.0, 7.0);
+ out._RESERVED_IDENTIFIER_FIXUP_21_0_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_25[0]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_21_0_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_25[0]._RESERVED_IDENTIFIER_FIXUP_m1;
+ out._RESERVED_IDENTIFIER_FIXUP_21_1_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_25[1]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_21_1_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_25[1]._RESERVED_IDENTIFIER_FIXUP_m1;
+ out._RESERVED_IDENTIFIER_FIXUP_21_2_RESERVED_IDENTIFIER_FIXUP_m0 = _RESERVED_IDENTIFIER_FIXUP_25[2]._RESERVED_IDENTIFIER_FIXUP_m0;
+ out._RESERVED_IDENTIFIER_FIXUP_21_2_RESERVED_IDENTIFIER_FIXUP_m1 = _RESERVED_IDENTIFIER_FIXUP_25[2]._RESERVED_IDENTIFIER_FIXUP_m1;
+ return out;
+}
+