James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 1 | #include <metal_stdlib> |
| 2 | using namespace metal; |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 3 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 4 | template<typename T, size_t N> |
| 5 | struct tint_array { |
| 6 | const constant T& operator[](size_t i) const constant { return elements[i]; } |
| 7 | device T& operator[](size_t i) device { return elements[i]; } |
| 8 | const device T& operator[](size_t i) const device { return elements[i]; } |
| 9 | thread T& operator[](size_t i) thread { return elements[i]; } |
| 10 | const thread T& operator[](size_t i) const thread { return elements[i]; } |
| 11 | threadgroup T& operator[](size_t i) threadgroup { return elements[i]; } |
| 12 | const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; } |
| 13 | T elements[N]; |
| 14 | }; |
dan sinclair | f1f381a | 2023-11-22 09:44:15 +0000 | [diff] [blame] | 15 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 16 | struct S { |
James Price | 520a86a | 2024-08-22 23:14:21 +0000 | [diff] [blame] | 17 | /* 0x0000 */ tint_array<int4, 4> arr; |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 18 | }; |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 19 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 20 | struct S_nested { |
James Price | 520a86a | 2024-08-22 23:14:21 +0000 | [diff] [blame] | 21 | /* 0x0000 */ tint_array<tint_array<tint_array<int, 2>, 3>, 4> arr; |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 22 | }; |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 23 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 24 | struct tint_module_vars_struct { |
| 25 | thread tint_array<int4, 4>* src_private; |
| 26 | threadgroup tint_array<int4, 4>* src_workgroup; |
| 27 | const constant S* src_uniform; |
| 28 | device S* src_storage; |
| 29 | device S* dst; |
| 30 | device S_nested* dst_nested; |
| 31 | }; |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 32 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 33 | struct tint_symbol_2 { |
| 34 | tint_array<int4, 4> tint_symbol_1; |
| 35 | }; |
dan sinclair | f1f381a | 2023-11-22 09:44:15 +0000 | [diff] [blame] | 36 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 37 | tint_array<int4, 4> ret_arr() { |
| 38 | return tint_array<int4, 4>{}; |
dan sinclair | f1f381a | 2023-11-22 09:44:15 +0000 | [diff] [blame] | 39 | } |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 40 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 41 | S ret_struct_arr() { |
| 42 | return S{}; |
dan sinclair | f1f381a | 2023-11-22 09:44:15 +0000 | [diff] [blame] | 43 | } |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 44 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 45 | void foo(tint_array<int4, 4> src_param, tint_module_vars_struct tint_module_vars) { |
| 46 | tint_array<int4, 4> src_function = {}; |
| 47 | (*tint_module_vars.dst).arr = tint_array<int4, 4>{int4(1), int4(2), int4(3), int4(3)}; |
| 48 | (*tint_module_vars.dst).arr = src_param; |
| 49 | (*tint_module_vars.dst).arr = ret_arr(); |
| 50 | tint_array<int4, 4> const src_let = tint_array<int4, 4>{}; |
| 51 | (*tint_module_vars.dst).arr = src_let; |
| 52 | (*tint_module_vars.dst).arr = src_function; |
| 53 | (*tint_module_vars.dst).arr = (*tint_module_vars.src_private); |
| 54 | (*tint_module_vars.dst).arr = (*tint_module_vars.src_workgroup); |
| 55 | (*tint_module_vars.dst).arr = ret_struct_arr().arr; |
| 56 | (*tint_module_vars.dst).arr = (*tint_module_vars.src_uniform).arr; |
| 57 | (*tint_module_vars.dst).arr = (*tint_module_vars.src_storage).arr; |
| 58 | tint_array<tint_array<tint_array<int, 2>, 3>, 4> src_nested = {}; |
| 59 | (*tint_module_vars.dst_nested).arr = src_nested; |
dan sinclair | f1f381a | 2023-11-22 09:44:15 +0000 | [diff] [blame] | 60 | } |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 61 | |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 62 | void tint_symbol_inner(uint tint_local_index, tint_module_vars_struct tint_module_vars) { |
| 63 | { |
| 64 | uint v = 0u; |
| 65 | v = tint_local_index; |
| 66 | while(true) { |
| 67 | uint const v_1 = v; |
| 68 | if ((v_1 >= 4u)) { |
| 69 | break; |
dan sinclair | a01fd24 | 2023-12-05 20:23:42 +0000 | [diff] [blame] | 70 | } |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 71 | (*tint_module_vars.src_workgroup)[v_1] = int4(0); |
James Price | b5a904c | 2024-06-03 20:48:50 +0000 | [diff] [blame] | 72 | { |
| 73 | v = (v_1 + 1u); |
| 74 | } |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 75 | continue; |
dan sinclair | a01fd24 | 2023-12-05 20:23:42 +0000 | [diff] [blame] | 76 | } |
dan sinclair | a01fd24 | 2023-12-05 20:23:42 +0000 | [diff] [blame] | 77 | } |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 78 | threadgroup_barrier(mem_flags::mem_threadgroup); |
| 79 | tint_array<int4, 4> const ary = tint_array<int4, 4>{}; |
| 80 | foo(ary, tint_module_vars); |
dan sinclair | a01fd24 | 2023-12-05 20:23:42 +0000 | [diff] [blame] | 81 | } |
James Price | 48be7e8 | 2024-06-19 22:38:07 +0000 | [diff] [blame] | 82 | |
James Price | 085093d | 2024-06-06 02:09:47 +0000 | [diff] [blame] | 83 | kernel void tint_symbol(uint tint_local_index [[thread_index_in_threadgroup]], threadgroup tint_symbol_2* v_2 [[threadgroup(0)]], const constant S* src_uniform [[buffer(0)]], device S* src_storage [[buffer(2)]], device S* dst [[buffer(1)]], device S_nested* dst_nested [[buffer(3)]]) { |
James Price | 77ac3f1 | 2024-05-30 14:32:11 +0000 | [diff] [blame] | 84 | thread tint_array<int4, 4> src_private = {}; |
| 85 | tint_module_vars_struct const tint_module_vars = tint_module_vars_struct{.src_private=(&src_private), .src_workgroup=(&(*v_2).tint_symbol_1), .src_uniform=src_uniform, .src_storage=src_storage, .dst=dst, .dst_nested=dst_nested}; |
| 86 | tint_symbol_inner(tint_local_index, tint_module_vars); |
| 87 | } |