blob: a5d2af7dcfaf92f622cf59d70b25d789126e0469 [file] [log] [blame]
James Price77ac3f12024-05-30 14:32:11 +00001#include <metal_stdlib>
2using namespace metal;
James Price48be7e82024-06-19 22:38:07 +00003
James Price77ac3f12024-05-30 14:32:11 +00004template<typename T, size_t N>
5struct 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 sinclairf1f381a2023-11-22 09:44:15 +000015
James Price77ac3f12024-05-30 14:32:11 +000016struct S {
James Price520a86a2024-08-22 23:14:21 +000017 /* 0x0000 */ tint_array<int4, 4> arr;
James Price77ac3f12024-05-30 14:32:11 +000018};
James Price48be7e82024-06-19 22:38:07 +000019
James Price77ac3f12024-05-30 14:32:11 +000020struct S_nested {
James Price520a86a2024-08-22 23:14:21 +000021 /* 0x0000 */ tint_array<tint_array<tint_array<int, 2>, 3>, 4> arr;
James Price77ac3f12024-05-30 14:32:11 +000022};
James Price48be7e82024-06-19 22:38:07 +000023
James Price77ac3f12024-05-30 14:32:11 +000024struct 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 Price48be7e82024-06-19 22:38:07 +000032
James Price77ac3f12024-05-30 14:32:11 +000033struct tint_symbol_2 {
34 tint_array<int4, 4> tint_symbol_1;
35};
dan sinclairf1f381a2023-11-22 09:44:15 +000036
James Price77ac3f12024-05-30 14:32:11 +000037tint_array<int4, 4> ret_arr() {
38 return tint_array<int4, 4>{};
dan sinclairf1f381a2023-11-22 09:44:15 +000039}
James Price48be7e82024-06-19 22:38:07 +000040
James Price77ac3f12024-05-30 14:32:11 +000041S ret_struct_arr() {
42 return S{};
dan sinclairf1f381a2023-11-22 09:44:15 +000043}
James Price48be7e82024-06-19 22:38:07 +000044
James Price77ac3f12024-05-30 14:32:11 +000045void 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 sinclairf1f381a2023-11-22 09:44:15 +000060}
James Price48be7e82024-06-19 22:38:07 +000061
James Price77ac3f12024-05-30 14:32:11 +000062void 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 sinclaira01fd242023-12-05 20:23:42 +000070 }
James Price77ac3f12024-05-30 14:32:11 +000071 (*tint_module_vars.src_workgroup)[v_1] = int4(0);
James Priceb5a904c2024-06-03 20:48:50 +000072 {
73 v = (v_1 + 1u);
74 }
James Price77ac3f12024-05-30 14:32:11 +000075 continue;
dan sinclaira01fd242023-12-05 20:23:42 +000076 }
dan sinclaira01fd242023-12-05 20:23:42 +000077 }
James Price77ac3f12024-05-30 14:32:11 +000078 threadgroup_barrier(mem_flags::mem_threadgroup);
79 tint_array<int4, 4> const ary = tint_array<int4, 4>{};
80 foo(ary, tint_module_vars);
dan sinclaira01fd242023-12-05 20:23:42 +000081}
James Price48be7e82024-06-19 22:38:07 +000082
James Price085093d2024-06-06 02:09:47 +000083kernel 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 Price77ac3f12024-05-30 14:32:11 +000084 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}